Annotation of loncom/interface/londocs.pm, revision 1.245
1.1 www 1: # The LearningOnline Network
1.2 www 2: # Documents
1.1 www 3: #
1.245 ! albertel 4: # $Id: londocs.pm,v 1.244 2006/08/11 22:00:07 albertel Exp $
1.1 www 5: #
1.3 www 6: # Copyright Michigan State University Board of Trustees
1.1 www 7: #
1.3 www 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
1.1 www 9: #
1.3 www 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.
1.1 www 14: #
1.3 www 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:
1.2 www 29: package Apache::londocs;
1.1 www 30:
31: use strict;
1.28 www 32: use Apache::Constants qw(:common :http);
1.158 raeburn 33: use Apache::imsexport;
1.4 www 34: use Apache::lonnet;
35: use Apache::loncommon;
1.245 ! albertel 36: use LONCAPA::map();
! 37: use Apache::lonratedt();
1.7 www 38: use Apache::lonratsrv;
1.15 www 39: use Apache::lonxml;
1.244 albertel 40: use Apache::lonclonecourse;
1.138 raeburn 41: use Apache::lonnavmaps;
1.38 www 42: use HTML::Entities;
1.27 www 43: use GDBM_File;
1.81 www 44: use Apache::lonlocal;
1.143 raeburn 45: use Cwd;
1.228 www 46: use LONCAPA;
1.7 www 47:
1.8 www 48: my $iconpath;
1.7 www 49:
1.27 www 50: my %hash;
51:
52: my $hashtied;
1.29 www 53: my %alreadyseen=();
1.27 www 54:
1.40 www 55: my $hadchanges;
56:
1.47 www 57: # Available help topics
58:
59: my %help=();
60:
1.245 ! albertel 61: # Mapread read maps into LONCAPA::map:: global arrays
1.10 www 62: # @order and @resources, determines status
1.7 www 63: # sets @order - pointer to resources in right order
64: # sets @resources - array with the resources with correct idx
65: #
66:
67: sub mapread {
68: my ($coursenum,$coursedom,$map)=@_;
69: return
1.245 ! albertel 70: &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
! 71: $map);
1.7 www 72: }
73:
74: sub storemap {
75: my ($coursenum,$coursedom,$map)=@_;
1.104 albertel 76: my ($outtext,$errtext)=
1.245 ! albertel 77: &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
! 78: $map,1);
1.104 albertel 79: if ($errtext) { return ($errtext,2); }
80:
81: $hadchanges=1;
82: return ($errtext,0);
1.7 www 83: }
84:
1.74 www 85: # ----------------------------------------- Return hash with valid author names
86:
87: sub authorhosts {
88: my %outhash=();
89: my $home=0;
90: my $other=0;
1.174 albertel 91: foreach (keys %env) {
1.74 www 92: if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
93: my $role=$1;
94: my $realm=$2;
1.174 albertel 95: my ($start,$end)=split(/\./,$env{$_});
1.74 www 96: if (($start) && ($start>time)) { next; }
97: if (($end) && (time>$end)) { next; }
98: my $ca; my $cd;
99: if ($1 eq 'au') {
1.174 albertel 100: $ca=$env{'user.name'};
101: $cd=$env{'user.domain'};
1.74 www 102: } else {
103: ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
104: }
1.107 albertel 105: my $allowed=0;
106: my $myhome=&Apache::lonnet::homeserver($ca,$cd);
107: my @ids=&Apache::lonnet::current_machine_ids();
108: foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
109: if ($allowed) {
1.74 www 110: $home++;
111: $outhash{'home_'.$ca.'@'.$cd}=1;
112: } else {
1.107 albertel 113: $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
1.74 www 114: $other++;
115: }
116: }
117: }
118: return ($home,$other,%outhash);
119: }
120: # ------------------------------------------------------ Generate "dump" button
121:
122: sub dumpbutton {
123: my ($home,$other,%outhash)=&authorhosts();
1.230 albertel 124: my $type = &Apache::loncommon::course_type();
1.74 www 125: if ($home+$other==0) { return ''; }
126: my $output='</td><td bgcolor="#DDDDCC">';
127: if ($home) {
128: return '</td><td bgcolor="#DDDDCC">'.
1.81 www 129: '<input type="submit" name="dumpcourse" value="'.
1.230 albertel 130: &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
1.130 www 131: &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs');
1.74 www 132: } else {
133: return'</td><td bgcolor="#DDDDCC">'.
1.230 albertel 134: &mt('Dump '.$type.
135: ' DOCS to Construction Space: available on other servers');
1.74 www 136: }
137: }
138:
1.164 albertel 139: sub clean {
140: my ($title)=@_;
141: $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
142: return $title;
143: }
1.74 www 144: # -------------------------------------------------------- Actually dump course
145:
146: sub dumpcourse {
1.224 albertel 147: my ($r) = @_;
1.230 albertel 148: my $type = &Apache::loncommon::course_type();
149: $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
150: '<form name="dumpdoc" method="post">');
1.74 www 151: my ($home,$other,%outhash)=&authorhosts();
1.75 www 152: unless ($home) { return ''; }
1.174 albertel 153: my $origcrsid=$env{'request.course.id'};
1.76 www 154: my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
1.174 albertel 155: if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
1.76 www 156: # Do the dumping
1.174 albertel 157: unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; }
158: my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
1.87 www 159: $r->print('<h3>'.&mt('Copying Files').'</h3>');
1.174 albertel 160: my $title=$env{'form.authorfolder'};
1.164 albertel 161: $title=&clean($title);
1.79 www 162: my %replacehash=();
1.174 albertel 163: foreach (keys %env) {
1.79 www 164: if ($_=~/^form\.namefor\_(.+)/) {
1.174 albertel 165: $replacehash{$1}=$env{$_};
1.79 www 166: }
167: }
1.174 albertel 168: my $crs='/uploaded/'.$env{'request.course.id'}.'/';
1.79 www 169: $crs=~s/\_/\//g;
170: foreach (keys %replacehash) {
171: my $newfilename=$title.'/'.$replacehash{$_};
1.205 albertel 172: $newfilename=~s/\.(\w+)$//;
173: my $ext=$1;
1.164 albertel 174: $newfilename=&clean($newfilename);
1.205 albertel 175: $newfilename.='.'.$ext;
1.79 www 176: my @dirs=split(/\//,$newfilename);
177: my $path='/home/'.$ca.'/public_html';
178: my $makepath=$path;
179: my $fail=0;
180: for (my $i=0;$i<$#dirs;$i++) {
181: $makepath.='/'.$dirs[$i];
182: unless (-e $makepath) {
183: unless(mkdir($makepath,0777)) { $fail=1; }
184: }
185: }
186: $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
187: if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
188: if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
1.244 albertel 189: print $fh &Apache::lonclonecourse::rewritefile(
190: &Apache::lonclonecourse::readfile($env{'request.course.id'},$_),
1.79 www 191: (%replacehash,$crs => '')
192: );
193: } else {
194: print $fh
1.244 albertel 195: &Apache::lonclonecourse::readfile($env{'request.course.id'},$_);
1.79 www 196: }
197: $fh->close();
198: } else {
199: $fail=1;
200: }
201: if ($fail) {
202: $r->print('<font color="red">fail</font>');
203: } else {
204: $r->print('<font color="green">ok</font>');
205: }
206: }
1.76 www 207: } else {
208: # Input form
209: unless ($home==1) {
210: $r->print(
1.81 www 211: '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
1.76 www 212: }
213: foreach (sort keys %outhash) {
214: if ($_=~/^home_(.+)$/) {
215: if ($home==1) {
216: $r->print(
217: '<input type="hidden" name="authorspace" value="'.$1.'" />');
218: } else {
1.133 www 219: $r->print('<option value="'.$1.'">'.$1.' - '.
220: &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
1.76 www 221: }
222: }
223: }
224: unless ($home==1) {
225: $r->print('</select>');
226: }
227: my $title=$origcrsdata{'description'};
1.227 albertel 228: $title=~s/[\/\s]+/\_/gs;
1.164 albertel 229: $title=&clean($title);
1.81 www 230: $r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
1.76 www 231: &tiehash();
1.81 www 232: $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
1.244 albertel 233: foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
1.78 www 234: $r->print('<tr><td>'.$_.'</td>');
235: my ($ext)=($_=~/\.(\w+)$/);
236: my $title=$hash{'title_'.$hash{
237: 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
1.163 albertel 238: $title=~s/:/:/g;
1.78 www 239: $r->print('<td>'.($title?$title:' ').'</td>');
1.235 albertel 240: if (!$title) {
1.78 www 241: $title=$_;
1.235 albertel 242: } else {
243: $title=~s|/|_|g;
1.78 www 244: }
245: $title=~s/\.(\w+)$//;
1.164 albertel 246: $title=&clean($title);
1.78 www 247: $title.='.'.$ext;
1.79 www 248: $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");
1.76 www 249: }
1.78 www 250: $r->print("</table>\n");
1.76 www 251: &untiehash();
252: $r->print(
1.229 raeburn 253: '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump [_1] DOCS',$type).'" /></p></form>');
1.75 www 254: }
1.74 www 255: }
1.76 www 256:
1.138 raeburn 257: # ------------------------------------------------------ Generate "export" button
258:
259: sub exportbutton {
1.230 albertel 260: my $type = &Apache::loncommon::course_type();
1.138 raeburn 261: return '</td><td bgcolor="#DDDDCC">'.
262: '<input type="submit" name="exportcourse" value="'.
1.230 albertel 263: &mt('Export '.$type.' to IMS').'" />'.
1.203 raeburn 264: &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
1.138 raeburn 265: }
266:
267: sub exportcourse {
268: my $r=shift;
1.230 albertel 269: my $type = &Apache::loncommon::course_type();
1.138 raeburn 270: my %discussiontime = &Apache::lonnet::dump('discussiontimes',
1.174 albertel 271: $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
1.138 raeburn 272: my $numdisc = keys %discussiontime;
273: my $navmap = Apache::lonnavmaps::navmap->new();
274: my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
275: my $curRes;
1.143 raeburn 276: my $outcome;
1.138 raeburn 277:
278: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
279: ['finishexport']);
1.174 albertel 280: if ($env{'form.finishexport'}) {
1.138 raeburn 281: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
282: ['archive','discussion']);
283:
1.175 albertel 284: my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
285: my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
1.143 raeburn 286: if (@exportitems == 0 && @discussions == 0) {
287: $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created. Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
288: } else {
289: my $now = time;
290: my %symbs;
291: my $manifestok = 0;
292: my $imsresources;
293: my $tempexport;
294: my $copyresult;
295: my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
296: if ($manifestok) {
1.157 raeburn 297: &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
1.143 raeburn 298: close($ims_manifest);
299:
300: #Create zip file in prtspool
301: my $imszipfile = '/prtspool/'.
1.174 albertel 302: $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.143 raeburn 303: time.'_'.rand(1000000000).'.zip';
304: my $cwd = &Cwd::getcwd();
305: my $imszip = '/home/httpd/'.$imszipfile;
306: chdir $tempexport;
307: open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
308: close(OUTPUT);
309: chdir $cwd;
1.230 albertel 310: $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
1.143 raeburn 311: if ($copyresult) {
312: $outcome .= 'The following errors occurred during export - '.$copyresult;
1.138 raeburn 313: }
1.143 raeburn 314: } else {
315: $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />';
1.138 raeburn 316: }
317: }
1.229 raeburn 318: $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
1.143 raeburn 319: $r->print($outcome);
1.224 albertel 320: $r->print(&Apache::loncommon::end_page());
1.138 raeburn 321: } else {
322: my $display;
323: $display = '<form name="exportdoc" method="post">'."\n";
1.230 albertel 324: $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
1.138 raeburn 325: $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
326: '<tr><td><fieldset><legend> <b>Content items</b></legend>'.
327: '<input type="button" value="check all" '.
328: 'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
329: ' <input type="button" value="uncheck all"'.
330: ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
331: '<td> </td><td> </td>'.
332: '<td align="right"><fieldset><legend> <b>Discussion posts'.
333: '</b></legend><input type="button" value="check all"'.
334: ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
335: ' <input type="button" value="uncheck all"'.
336: ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
337: '</tr></table>';
338: my $curRes;
339: my $depth = 0;
340: my $count = 0;
341: my $boards = 0;
342: my $startcount = 5;
343: my %parent = ();
344: my %children = ();
345: my $lastcontainer = $startcount;
346: my @bgcolors = ('#F6F6F6','#FFFFFF');
347: $display .= '<table cellspacing="0"><tr>'.
348: '<td><b>Export content item?<br /></b></td><td> </td><td align="right">'."\n";
349: if ($numdisc > 0) {
350: $display.='<b>Export discussion posts?</b>'."\n";
351: }
352: $display.=' </td></tr>';
353: while ($curRes = $it->next()) {
354: if (ref($curRes)) {
355: $count ++;
356: }
357: if ($curRes == $it->BEGIN_MAP()) {
358: $depth++;
359: $parent{$depth} = $lastcontainer;
360: }
361: if ($curRes == $it->END_MAP()) {
362: $depth--;
363: $lastcontainer = $parent{$depth};
364: }
365: if (ref($curRes)) {
366: my $symb = $curRes->symb();
1.158 raeburn 367: my $ressymb = $symb;
368: if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
369: unless ($ressymb =~ m|adm/wrapper/adm|) {
370: $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
371: }
372: }
1.138 raeburn 373: my $color = $count%2;
374: $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
375: '<input type="checkbox" name="archive" value="'.$count.'" ';
376: if (($curRes->is_sequence()) || ($curRes->is_page())) {
377: my $checkitem = $count + $boards + $startcount;
378: $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
379: }
380: $display .= ' />'."\n";
381: for (my $i=0; $i<$depth; $i++) {
382: $display .= '<img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" /><img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" />'."\n";
383: }
384: if ($curRes->is_sequence()) {
385: $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif"> '."\n";
386: $lastcontainer = $count + $startcount + $boards;
387: } elsif ($curRes->is_page()) {
388: $display .= '<img src="/adm/lonIcons/navmap.page.open.gif"> '."\n";
389: $lastcontainer = $count + $startcount + $boards;
390: }
391: my $currelem = $count+$boards+$startcount;
392: $children{$parent{$depth}} .= $currelem.':';
393: $display .= ' '.$curRes->title().'</td>';
1.158 raeburn 394: if ($discussiontime{$ressymb} > 0) {
1.138 raeburn 395: $boards ++;
396: $currelem = $count+$boards+$startcount;
397: $display .= '<td> </td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" /> </td>'."\n";
398: } else {
399: $display .= '<td colspan="2"> </td>'."\n";
400: }
401: }
402: }
403: my $scripttag = qq|
404: <script>
405:
406: function checkAll(field) {
1.158 raeburn 407: if (field.length > 0) {
408: for (i = 0; i < field.length; i++) {
409: field[i].checked = true ;
410: }
411: } else {
412: field.checked = true
413: }
1.138 raeburn 414: }
1.158 raeburn 415:
1.138 raeburn 416: function uncheckAll(field) {
1.158 raeburn 417: if (field.length > 0) {
418: for (i = 0; i < field.length; i++) {
419: field[i].checked = false ;
420: }
421: } else {
422: field.checked = false ;
423: }
1.138 raeburn 424: }
425:
426: function propagateCheck(item) {
427: if (document.exportdoc.elements[item].checked == true) {
428: containerCheck(item)
429: }
430: }
431:
432: function containerCheck(item) {
433: document.exportdoc.elements[item].checked = true
434: var numitems = $count + $boards + $startcount
435: var parents = new Array(numitems)
436: for (var i=$startcount; i<numitems; i++) {
437: parents[i] = new Array
438: }
439: |;
440:
441: foreach my $container (sort { $a <=> $b } keys %children) {
442: my @contents = split/:/,$children{$container};
443: for (my $i=0; $i<@contents; $i ++) {
444: $scripttag .= ' parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
445: }
446: }
447:
448: $scripttag .= qq|
449: if (parents[item].length > 0) {
450: for (var j=0; j<parents[item].length; j++) {
451: containerCheck(parents[item][j])
452: }
453: }
454: }
455:
456: </script>
457: |;
1.229 raeburn 458: $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
1.224 albertel 459: $scripttag));
460: $r->print($display.'</table>'.
1.138 raeburn 461: '<p><input type="hidden" name="finishexport" value="1">'.
462: '<input type="submit" name="exportcourse" value="'.
1.230 albertel 463: &mt('Export '.$type.' DOCS').'" /></p></form>'.
1.224 albertel 464: &Apache::loncommon::end_page());
1.138 raeburn 465: }
466: }
467:
1.143 raeburn 468: sub create_ims_store {
469: my ($now,$manifestok,$outcome,$tempexport) = @_;
470: $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
471: my $ims_manifest;
472: if (!-e $$tempexport) {
473: mkdir($$tempexport,0700);
474: }
475: $$tempexport .= '/'.$now;
476: if (!-e $$tempexport) {
477: mkdir($$tempexport,0700);
478: }
1.174 albertel 479: $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
1.143 raeburn 480: if (!-e $$tempexport) {
481: mkdir($$tempexport,0700);
482: }
1.159 raeburn 483: if (!-e "$$tempexport/resources") {
484: mkdir("$$tempexport/resources",0700);
485: }
1.143 raeburn 486: # open manifest file
487: my $manifest = '/imsmanifest.xml';
488: my $manifestfilename = $$tempexport.$manifest;
489: if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
490: $$manifestok=1;
491: print $ims_manifest
492: '<?xml version="1.0" encoding="UTF-8"?>'."\n".
493: '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
494: ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
495: ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
1.174 albertel 496: ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143 raeburn 497: ' xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
498: ' http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
1.199 raeburn 499: ' <metadata>
500: <schema></schema>
501: <imsmd:lom>
502: <imsmd:general>
503: <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
504: <imsmd:title>
505: <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
506: </imsmd:title>
507: </imsmd:general>
508: </imsmd:lom>
509: </metadata>'."\n".
1.174 albertel 510: ' <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
511: ' <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143 raeburn 512: ' structure="hierarchical">'."\n".
1.199 raeburn 513: ' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
1.143 raeburn 514: } else {
515: $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
516: ;
517: }
518: return $ims_manifest;
519: }
520:
521: sub build_package {
522: my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
523: # first iterator to look for dependencies
524: my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
525: my $curRes;
526: my $count = 0;
527: my $depth = 0;
528: my $lastcontainer = 0;
529: my %parent = ();
530: my @dependencies = ();
1.174 albertel 531: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
532: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.143 raeburn 533: while ($curRes = $it->next()) {
534: if (ref($curRes)) {
535: $count ++;
536: }
537: if ($curRes == $it->BEGIN_MAP()) {
538: $depth++;
539: $parent{$depth} = $lastcontainer;
540: }
541: if ($curRes == $it->END_MAP()) {
542: $depth--;
543: $lastcontainer = $parent{$depth};
544: }
545: if (ref($curRes)) {
546: if ($curRes->is_sequence() || $curRes->is_page()) {
547: $lastcontainer = $count;
548: }
549: if (grep/^$count$/,@$exportitems) {
550: &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
551: }
552: }
553: }
554: # second iterator to build manifest and store resources
555: $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
556: $depth = 0;
557: my $prevdepth;
558: $count = 0;
559: my $imsresources;
560: my $pkgdepth;
1.157 raeburn 561: while ($curRes = $it->next()) {
562: if ($curRes == $it->BEGIN_MAP()) {
563: $prevdepth = $depth;
564: $depth++;
565: }
566: if ($curRes == $it->END_MAP()) {
1.143 raeburn 567: $prevdepth = $depth;
1.157 raeburn 568: $depth--;
569: }
570:
571: if (ref($curRes)) {
572: $count ++;
573: if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
574: my $symb = $curRes->symb();
575: my $isvisible = 'true';
576: my $resourceref;
577: if ($curRes->randomout()) {
578: $isvisible = 'false';
579: }
580: unless ($curRes->is_sequence()) {
1.174 albertel 581: $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
1.157 raeburn 582: }
1.199 raeburn 583: my $step = $prevdepth - $depth;
584: if (($step >= 0) && ($count > 1)) {
585: while ($step >= 0) {
586: print $ims_manifest "\n".' </item>'."\n";
587: $step --;
588: }
1.157 raeburn 589: }
590: $prevdepth = $depth;
1.143 raeburn 591:
1.157 raeburn 592: my $itementry =
1.174 albertel 593: '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
1.143 raeburn 594: '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
595: '<title>'.$curRes->title().'</title>';
1.157 raeburn 596: print $ims_manifest "\n".$itementry;
1.143 raeburn 597:
1.157 raeburn 598: unless ($curRes->is_sequence()) {
599: my $content_file;
600: my @hrefs = ();
601: &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
602: if ($content_file) {
603: $imsresources .= "\n".
1.174 albertel 604: ' <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
1.143 raeburn 605: '" type="webcontent" href="'.$content_file.'">'."\n".
606: ' <file href="'.$content_file.'" />'."\n";
1.157 raeburn 607: foreach (@hrefs) {
608: $imsresources .=
1.143 raeburn 609: ' <file href="'.$_.'" />'."\n";
1.157 raeburn 610: }
1.158 raeburn 611: if (grep/^$count$/,@$discussions) {
612: my $ressymb = $symb;
613: my $mode;
614: if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
615: unless ($ressymb =~ m|adm/wrapper/adm|) {
616: $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
617: }
618: $mode = 'board';
619: }
620: my %extras = (
621: caller => 'imsexport',
1.159 raeburn 622: tempexport => $tempexport.'/resources',
1.158 raeburn 623: count => $count
624: );
625: my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
626: }
1.157 raeburn 627: $imsresources .= ' </resource>'."\n";
1.143 raeburn 628: }
629: }
1.157 raeburn 630: $pkgdepth = $depth;
1.143 raeburn 631: }
632: }
633: }
1.157 raeburn 634: while ($pkgdepth > 0) {
1.143 raeburn 635: print $ims_manifest " </item>\n";
636: $pkgdepth --;
637: }
638: my $resource_text = qq|
639: </organization>
640: </organizations>
641: <resources>
642: $imsresources
643: </resources>
644: </manifest>
645: |;
646: print $ims_manifest $resource_text;
647: }
648:
649: sub get_dependencies {
650: my ($exportitems,$parent,$depth,$dependencies) = @_;
651: if ($depth > 1) {
1.157 raeburn 652: if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
1.143 raeburn 653: push @$dependencies, $$parent{$depth};
654: if ($depth > 2) {
655: &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
656: }
657: }
658: }
659: }
660:
661: sub process_content {
662: my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
663: my $content_type;
664: my $message;
1.158 raeburn 665: my @uploads = ();
1.157 raeburn 666: if ($curRes->is_sequence()) {
667: $content_type = 'sequence';
668: } elsif ($curRes->is_page()) {
669: $content_type = 'page'; # need to handle individual items in pages.
1.143 raeburn 670: } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
671: $content_type = 'syllabus';
1.158 raeburn 672: my $contents = &Apache::imsexport::templatedpage($content_type);
673: if ($contents) {
674: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
675: }
1.157 raeburn 676: } elsif ($symb =~ m-\.sequence___\d+___ext-) {
1.143 raeburn 677: $content_type = 'external';
1.158 raeburn 678: my $title = $curRes->title;
679: my $contents = &Apache::imsexport::external($symb,$title);
680: if ($contents) {
681: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
682: }
1.143 raeburn 683: } elsif ($symb =~ m-adm/navmaps$-) {
684: $content_type = 'navmap';
1.158 raeburn 685: } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
1.143 raeburn 686: $content_type = 'simplepage';
1.158 raeburn 687: my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
688: if ($contents) {
689: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
690: }
691: } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
1.143 raeburn 692: $content_type = 'simpleproblem';
1.158 raeburn 693: my $contents = &Apache::imsexport::simpleproblem($symb);
694: if ($contents) {
695: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
696: }
1.188 raeburn 697: } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
1.158 raeburn 698: $content_type = 'examupload';
699: } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
1.143 raeburn 700: $content_type = 'bulletinboard';
1.158 raeburn 701: my $contents = &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
702: if ($contents) {
703: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
704: }
705: } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
1.143 raeburn 706: $content_type = 'aboutme';
1.158 raeburn 707: my $contents = &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
708: if ($contents) {
709: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
710: }
1.157 raeburn 711: } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
712: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.162 raeburn 713: } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
1.143 raeburn 714: my $canedit = 0;
1.174 albertel 715: if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'}) {
1.143 raeburn 716: $canedit= 1;
717: }
1.200 raeburn 718: # only include problem code where current user is author
1.143 raeburn 719: if ($canedit) {
1.157 raeburn 720: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
1.143 raeburn 721: } else {
1.157 raeburn 722: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
1.143 raeburn 723: }
1.162 raeburn 724: } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
725: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.143 raeburn 726: }
1.158 raeburn 727: if (@uploads > 0) {
728: foreach my $item (@uploads) {
729: my $uploadmsg = '';
1.159 raeburn 730: &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
1.158 raeburn 731: if ($uploadmsg) {
732: $$copyresult .= $uploadmsg."\n";
733: }
734: }
735: }
1.157 raeburn 736: if ($message) {
737: $$copyresult .= $message."\n";
738: }
1.143 raeburn 739: }
740:
741: sub replicate_content {
1.157 raeburn 742: my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
1.159 raeburn 743: my ($map,$ind,$url);
744: if ($caller eq 'templateupload') {
745: $url = $symb;
746: $url =~ s#//#/#g;
747: } else {
748: ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
749: }
1.143 raeburn 750: my $content;
751: my $filename;
752: my $repstatus;
1.157 raeburn 753: my $content_name;
754: if ($url =~ m-/([^/]+)$-) {
1.143 raeburn 755: $filename = $1;
756: if (!-e $tempexport.'/resources') {
757: mkdir($tempexport.'/resources',0700);
758: }
1.157 raeburn 759: if (!-e $tempexport.'/resources/'.$count) {
1.143 raeburn 760: mkdir($tempexport.'/resources/'.$count,0700);
761: }
1.157 raeburn 762: my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
1.143 raeburn 763: my $copiedfile;
764: if ($copiedfile = Apache::File->new('>'.$destination)) {
765: my $content;
1.157 raeburn 766: if ($caller eq 'resource') {
1.197 raeburn 767: my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
768: my $filepath = &Apache::lonnet::filelocation($respath,$url);
769: $content = &Apache::lonnet::getfile($filepath);
1.143 raeburn 770: if ($content eq -1) {
771: $$message = 'Could not copy file '.$filename;
772: } else {
1.197 raeburn 773: &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
1.143 raeburn 774: $repstatus = 'ok';
775: }
1.162 raeburn 776: } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
1.143 raeburn 777: my $rtncode;
1.157 raeburn 778: $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
779: if ($repstatus eq 'ok') {
780: if ($url =~ /\.html?$/i) {
1.197 raeburn 781: &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
1.157 raeburn 782: }
783: } else {
1.197 raeburn 784: $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
1.143 raeburn 785: }
1.162 raeburn 786: } elsif ($caller eq 'noedit') {
787: # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this.
788: $repstatus = 'ok';
789: $content = 'Not the owner of this resource';
1.143 raeburn 790: }
791: if ($repstatus eq 'ok') {
792: print $copiedfile $content;
793: }
794: close($copiedfile);
795: } else {
1.197 raeburn 796: $$message = 'Could not open destination file for '.$filename."<br />\n";
1.143 raeburn 797: }
798: } else {
1.197 raeburn 799: $$message = 'Could not determine name of file for '.$symb."<br />\n";
1.143 raeburn 800: }
1.157 raeburn 801: if ($repstatus eq 'ok') {
1.198 raeburn 802: $content_name = 'resources/'.$count.'/'.$filename;
1.157 raeburn 803: }
804: return $content_name;
805: }
806:
807: sub extract_media {
1.197 raeburn 808: my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
1.198 raeburn 809: my ($dirpath,$container);
1.197 raeburn 810: my %allfiles = ();
811: my %codebase = ();
1.198 raeburn 812: if ($url =~ m-(.*/)([^/]+)$-) {
813: $dirpath = $1;
814: $container = $2;
815: } else {
816: $dirpath = $url;
817: $container = '';
818: }
1.197 raeburn 819: &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
820: foreach my $embed_file (keys(%allfiles)) {
821: my $filename;
822: if ($embed_file =~ m#([^/]+)$#) {
823: $filename = $1;
824: } else {
825: $filename = $embed_file;
826: }
827: my $newname = 'res/'.$filename;
828: my ($rtncode,$embed_content,$repstatus);
829: my $embed_url;
830: if ($embed_file =~ m-^/-) {
831: $embed_url = $embed_file; # points to absolute path
832: } else {
833: if ($embed_file =~ m-https?://-) {
834: next; # points to url
835: } else {
1.198 raeburn 836: $embed_url = $dirpath.$embed_file; # points to relative path
1.197 raeburn 837: }
838: }
839: if ($caller eq 'resource') {
840: my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
841: my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url);
842: $embed_content = &Apache::lonnet::getfile($embed_path);
843: unless ($embed_content eq -1) {
844: $repstatus = 'ok';
845: }
846: } elsif ($caller eq 'uploaded') {
847:
848: $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
849: }
850: if ($repstatus eq 'ok') {
851: my $destination = $tempexport.'/resources/'.$count.'/res';
852: if (!-e "$destination") {
853: mkdir($destination,0755);
854: }
855: $destination .= '/'.$filename;
856: my $copiedfile;
857: if ($copiedfile = Apache::File->new('>'.$destination)) {
858: print $copiedfile $embed_content;
1.198 raeburn 859: push @{$href}, 'resources/'.$count.'/res/'.$filename;
1.197 raeburn 860: my $attrib_regexp = '';
861: if (@{$allfiles{$embed_file}} > 1) {
862: $attrib_regexp = join('|',@{$allfiles{$embed_file}});
863: } else {
864: $attrib_regexp = $allfiles{$embed_file}[0];
865: }
866: $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
1.198 raeburn 867: if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
1.197 raeburn 868: $$content =~ s#\Q$embed_file\E#$newname#gi;
869: }
870: }
871: } else {
872: $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
873: }
874: }
1.157 raeburn 875: return;
1.143 raeburn 876: }
1.74 www 877:
1.158 raeburn 878: sub store_template {
879: my ($contents,$tempexport,$count,$content_type) = @_;
880: if ($contents) {
1.159 raeburn 881: if ($tempexport) {
882: if (!-e $tempexport.'/resources') {
883: mkdir($tempexport.'/resources',0700);
884: }
885: if (!-e $tempexport.'/resources/'.$count) {
886: mkdir($tempexport.'/resources/'.$count,0700);
887: }
888: my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
889: my $storetemplate;
890: if ($storetemplate = Apache::File->new('>'.$destination)) {
891: print $storetemplate $contents;
892: close($storetemplate);
893: }
894: if ($content_type eq 'external') {
1.198 raeburn 895: return 'resources/'.$count.'/'.$content_type.'.html';
1.159 raeburn 896: } else {
1.198 raeburn 897: return 'resources/'.$count.'/'.$content_type.'.xml';
1.159 raeburn 898: }
1.158 raeburn 899: }
900: }
901: }
902:
1.73 bowersj2 903: # Imports the given (name, url) resources into the course
904: # coursenum, coursedom, and folder must precede the list
905: sub group_import {
906: my $coursenum = shift;
907: my $coursedom = shift;
908: my $folder = shift;
1.142 raeburn 909: my $container = shift;
910: my $caller = shift;
1.73 bowersj2 911: while (@_) {
912: my $name = shift;
913: my $url = shift;
1.142 raeburn 914: if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
915: my $errtext = '';
916: my $fatal = 0;
917: my $newmapstr = '<map>'."\n".
918: '<resource id="1" src="" type="start"></resource>'."\n".
919: '<link from="1" to="2" index="1"></link>'."\n".
920: '<resource id="2" src="" type="finish"></resource>'."\n".
921: '</map>';
1.174 albertel 922: $env{'form.output'}=$newmapstr;
1.189 albertel 923: my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142 raeburn 924: 'output',$1.$2);
925: if ($result != m|^/uploaded/|) {
926: $errtext.='Map not saved: A network error occured when trying to save the new map. ';
927: $fatal = 2;
928: }
929: if ($fatal) {
930: return ($errtext,$fatal);
931: }
932: }
1.73 bowersj2 933: if ($url) {
1.245 ! albertel 934: my $idx = &LONCAPA::map::getresidx($url);
! 935: $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.73 bowersj2 936: my $ext = 'false';
937: if ($url=~/^http:\/\//) { $ext = 'true'; }
938: $url =~ s/:/\:/g;
939: $name =~ s/:/\:/g;
1.245 ! albertel 940: $LONCAPA::map::resources[$idx] =
1.73 bowersj2 941: join ':', ($name, $url, $ext, 'normal', 'res');
942: }
943: }
1.142 raeburn 944: return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73 bowersj2 945: }
946:
1.114 albertel 947: sub breadcrumbs {
948: my ($where)=@_;
949: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142 raeburn 950: my (@folders);
1.174 albertel 951: if ($env{'form.pagepath'}) {
952: @folders = split('&',$env{'form.pagepath'});
1.142 raeburn 953: } else {
1.174 albertel 954: @folders=split('&',$env{'form.folderpath'});
1.142 raeburn 955: }
1.116 albertel 956: my $folderpath;
1.168 www 957: my $cpinfo='';
1.174 albertel 958: if ($env{'form.markedcopy_url'}) {
1.168 www 959: $cpinfo='&markedcopy_url='.
1.228 www 960: &escape($env{'form.markedcopy_url'}).
1.168 www 961: '&markedcopy_title='.
1.228 www 962: &escape($env{'form.markedcopy_title'});
1.168 www 963: }
1.242 www 964: my $randompick=-1;
965: my $isencrypted=0;
966: my $ishidden=0;
1.116 albertel 967: while (@folders) {
968: my $folder=shift(@folders);
969: my $foldername=shift(@folders);
970: if ($folderpath) {$folderpath.='&';}
971: $folderpath.=$folder.'&'.$foldername;
972: my $url='/adm/coursedocs?folderpath='.
1.228 www 973: &escape($folderpath);
1.242 www 974: my $name=&unescape($foldername);
975: # randompick number, hidden, encrypted is appended with ":"s to the foldername
976: $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;
977: if ($1 ne '') {
978: $randompick=$1;
979: } else {
980: $randompick=-1;
981: }
982: if ($2) { $ishidden=1; }
983: if ($3) { $isencrypted=1; }
1.114 albertel 984: &Apache::lonhtmlcommon::add_breadcrumb(
1.168 www 985: {'href'=>$url.$cpinfo,
1.242 www 986: 'title'=>$name,
1.117 albertel 987: 'text'=>'<font size="+1">'.
1.242 www 988: $name.'</font>'
1.117 albertel 989: });
1.114 albertel 990: }
1.242 www 991: return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
992: 'LC_docs_path'),$randompick,$ishidden,$isencrypted);
1.114 albertel 993: }
994:
1.7 www 995: sub editor {
1.188 raeburn 996: my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10 www 997: my $errtext='';
998: my $fatal=0;
1.142 raeburn 999: my $container='sequence';
1.174 albertel 1000: if ($env{'form.pagepath'}) {
1.142 raeburn 1001: $container='page';
1002: }
1.10 www 1003: ($errtext,$fatal)=
1.142 raeburn 1004: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 ! albertel 1005: if ($#LONCAPA::map::order<1) {
! 1006: my $idx=&LONCAPA::map::getresidx();
1.178 www 1007: if ($idx<=0) { $idx=1; }
1.245 ! albertel 1008: $LONCAPA::map::order[0]=$idx;
! 1009: $LONCAPA::map::resources[$idx]='';
1.17 www 1010: }
1.174 albertel 1011: if (defined($env{'form.markcopy'})) {
1.168 www 1012: # Mark for copying
1.245 ! albertel 1013: my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1.174 albertel 1014: $env{'form.markedcopy_title'}=$title;
1015: $env{'form.markedcopy_url'}=$url;
1.168 www 1016: }
1.242 www 1017: my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder);
1018: $r->print($breadcrumbtrail);
1.7 www 1019: if ($fatal) {
1020: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1021: } else {
1022: # ------------------------------------------------------------ Process commands
1.121 www 1023:
1.16 www 1024: # ---------------- if they are for this folder and user allowed to make changes
1.174 albertel 1025: if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123 www 1026: # set parameters and change order
1.174 albertel 1027: if (defined($env{'form.setparms'})) {
1028: my $idx=$env{'form.setparms'};
1.123 www 1029: # set parameters
1.174 albertel 1030: if ($env{'form.randpick_'.$idx}) {
1.245 ! albertel 1031: &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
1.121 www 1032: } else {
1.245 ! albertel 1033: &LONCAPA::map::delparameter($idx,'parameter_randompick');
1.121 www 1034: }
1.174 albertel 1035: if ($env{'form.hidprs_'.$idx}) {
1.245 ! albertel 1036: &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
1.121 www 1037: } else {
1.245 ! albertel 1038: &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
1.121 www 1039: }
1.174 albertel 1040: if ($env{'form.encprs_'.$idx}) {
1.245 ! albertel 1041: &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
1.121 www 1042: } else {
1.245 ! albertel 1043: &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
1.121 www 1044: }
1045:
1.174 albertel 1046: if ($env{'form.newpos'}) {
1.123 www 1047: # change order
1048:
1.174 albertel 1049: my $newpos=$env{'form.newpos'}-1;
1050: my $currentpos=$env{'form.currentpos'}-1;
1.125 www 1051: my $i;
1052: my @neworder=();
1053: if ($newpos>$currentpos) {
1054: # moving stuff up
1055: for ($i=0;$i<$currentpos;$i++) {
1.245 ! albertel 1056: $neworder[$i]=$LONCAPA::map::order[$i];
1.125 www 1057: }
1058: for ($i=$currentpos;$i<$newpos;$i++) {
1.245 ! albertel 1059: $neworder[$i]=$LONCAPA::map::order[$i+1];
1.125 www 1060: }
1.245 ! albertel 1061: $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
! 1062: for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
! 1063: $neworder[$i]=$LONCAPA::map::order[$i];
1.125 www 1064: }
1065: } else {
1066: # moving stuff down
1067: for ($i=0;$i<$newpos;$i++) {
1.245 ! albertel 1068: $neworder[$i]=$LONCAPA::map::order[$i];
1.125 www 1069: }
1.245 ! albertel 1070: $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
1.125 www 1071: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
1.245 ! albertel 1072: $neworder[$i]=$LONCAPA::map::order[$i-1];
1.125 www 1073: }
1.245 ! albertel 1074: for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
! 1075: $neworder[$i]=$LONCAPA::map::order[$i];
1.125 www 1076: }
1077: }
1.245 ! albertel 1078: @LONCAPA::map::order=@neworder;
1.124 www 1079: }
1080: # store the changed version
1.123 www 1081:
1.142 raeburn 1082: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124 www 1083: if ($fatal) {
1084: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1085: return;
1.123 www 1086: }
1.124 www 1087:
1088: }
1.174 albertel 1089: if ($env{'form.pastemarked'}) {
1.168 www 1090: # paste resource to end of list
1.174 albertel 1091: my $url=$env{'form.markedcopy_url'};
1092: my $title=$env{'form.markedcopy_title'};
1.168 www 1093: # Maps need to be copied first
1094: if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
1095: $title=&mt('Copy of').' '.$title;
1096: my $newid=$$.time;
1097: $url=~/^(.+)\.(\w+)$/;
1098: my $newurl=$1.$newid.'.'.$2;
1099: my $storefn=$newurl;
1100: $storefn=~s/^\/\w+\/\w+\/\w+\///;
1.244 albertel 1101: &Apache::lonclonecourse::writefile
1.174 albertel 1102: ($env{'request.course.id'},$storefn,
1.168 www 1103: &Apache::lonnet::getfile($url));
1104: $url=$newurl;
1105: }
1106: $title=~s/\</\<\;/g;
1107: $title=~s/\>/\>\;/g;
1108: $title=~s/\:/\:/g;
1109: my $ext='false';
1110: if ($url=~/^http\:\/\//) { $ext='true'; }
1111: $url=~s/\:/\:/g;
1112: # Now insert the URL at the bottom
1.245 ! albertel 1113: my $newidx=&LONCAPA::map::getresidx($url);
! 1114: $LONCAPA::map::resources[$newidx]=
1.168 www 1115: $title.':'.$url.':'.$ext.':normal:res';
1.245 ! albertel 1116: $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
1.168 www 1117: # Store the result
1118: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1119: if ($fatal) {
1120: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1121: return;
1122: }
1.123 www 1123:
1.168 www 1124: }
1.188 raeburn 1125: $r->print($upload_output);
1.174 albertel 1126: if ($env{'form.cmd'}) {
1127: my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10 www 1128: if ($cmd eq 'del') {
1.245 ! albertel 1129: my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.187 www 1130: if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206 albertel 1131: ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187 www 1132: &Apache::lonnet::removeuploadedurl($url);
1133: } else {
1.245 ! albertel 1134: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1.128 albertel 1135: }
1.245 ! albertel 1136: for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
! 1137: $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.10 www 1138: }
1.245 ! albertel 1139: $#LONCAPA::map::order--;
1.171 www 1140: } elsif ($cmd eq 'cut') {
1.245 ! albertel 1141: my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
! 1142: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
! 1143: for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
! 1144: $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.171 www 1145: }
1.245 ! albertel 1146: $#LONCAPA::map::order--;
1.10 www 1147: } elsif ($cmd eq 'up') {
1.245 ! albertel 1148: if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
! 1149: my $i=$LONCAPA::map::order[$idx-1];
! 1150: $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx];
! 1151: $LONCAPA::map::order[$idx] = $i;
1.38 www 1152: }
1.10 www 1153: } elsif ($cmd eq 'down') {
1.245 ! albertel 1154: if (defined($LONCAPA::map::order[$idx+1])) {
! 1155: my $i=$LONCAPA::map::order[$idx+1];
! 1156: $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
! 1157: $LONCAPA::map::order[$idx] = $i;
1.38 www 1158: }
1.36 www 1159: } elsif ($cmd eq 'rename') {
1.245 ! albertel 1160: my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.36 www 1161: my ($rtitle,@rrest)=split(/\:/,
1.245 ! albertel 1162: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.38 www 1163: my $comment=
1.174 albertel 1164: &HTML::Entities::decode($env{'form.title'});
1.36 www 1165: $comment=~s/\</\<\;/g;
1166: $comment=~s/\>/\>\;/g;
1167: $comment=~s/\:/\:/g;
1.144 albertel 1168: if ($comment=~/\S/) {
1.245 ! albertel 1169: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
! 1170: $comment.':'.join(':',@rrest);
1.144 albertel 1171: }
1.238 www 1172: # Devalidate title cache
1.240 www 1173: my $renamed_url=$rrest[0];
1174: # Has the :-escaping
1175: $renamed_url=~s/\&colon\;/\:/g;
1176: &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10 www 1177: }
1178: # Store the changed version
1.104 albertel 1179: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1180: $folder.'.'.$container);
1.104 albertel 1181: if ($fatal) {
1182: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1183: return;
1184: }
1.8 www 1185: }
1.11 www 1186: # Group import/search
1.174 albertel 1187: if ($env{'form.importdetail'}) {
1.73 bowersj2 1188: my @imports;
1.243 www 1189: # &Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174 albertel 1190: foreach (split(/\&/,$env{'form.importdetail'})) {
1.73 bowersj2 1191: if (defined($_)) {
1192: my ($name,$url)=split(/\=/,$_);
1.228 www 1193: $name=&unescape($name);
1194: $url=&unescape($url);
1.73 bowersj2 1195: push @imports, $name, $url;
1196: }
1197: }
1.11 www 1198: # Store the changed version
1.104 albertel 1199: ($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,
1.142 raeburn 1200: $container,'londocs',@imports);
1.104 albertel 1201: if ($fatal) {
1202: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1203: return;
1204: }
1.11 www 1205: }
1.53 www 1206: # Loading a complete map
1.223 www 1207: if ($env{'form.loadmap'}) {
1208: if ($env{'form.importmap'}=~/\w/) {
1209: foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
1210: my ($title,$url,$ext,$type)=split(/\:/,$_);
1.245 ! albertel 1211: my $idx=&LONCAPA::map::getresidx($url);
! 1212: $LONCAPA::map::resources[$idx]=$_;
! 1213: $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.223 www 1214: }
1.53 www 1215: # Store the changed version
1.223 www 1216: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1217: $folder.'.'.$container);
1.223 www 1218: if ($fatal) {
1219: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1220: return;
1221: }
1222: } else {
1223: $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
1224: }
1.53 www 1225: }
1.16 www 1226: }
1227: # ---------------------------------------------------------------- End commands
1.7 www 1228: # ---------------------------------------------------------------- Print screen
1.10 www 1229: my $idx=0;
1.148 www 1230: my $shown=0;
1.242 www 1231: if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
1232: $r->print('<p>'.&mt('Parameters').':<ul>'.
1233: ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
1234: ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
1235: ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
1236: '</ul></p>');
1237: }
1238: if ($randompick>=0) {
1239: $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');
1240: }
1.10 www 1241: $r->print('<table>');
1.245 ! albertel 1242: foreach (@LONCAPA::map::order) {
! 1243: my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
1.207 albertel 1244: $name=&Apache::lonratsrv::qtescape($name);
1245: $url=&Apache::lonratsrv::qtescape($url);
1.10 www 1246: unless ($name) { $name=(split(/\//,$url))[-1]; }
1.148 www 1247: unless ($name) { $idx++; next; }
1.112 raeburn 1248: $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
1.10 www 1249: $idx++;
1.148 www 1250: $shown++;
1.10 www 1251: }
1.148 www 1252: unless ($shown) {
1.131 www 1253: $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
1254: }
1.168 www 1255: $r->print("\n</table>\n");
1.174 albertel 1256: if ($env{'form.markedcopy_url'}) {
1.168 www 1257: $r->print(<<ENDPASTE);
1258: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174 albertel 1259: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1260: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168 www 1261: ENDPASTE
1262: $r->print(
1263: '<input type="submit" name="pastemarked" value="'.&mt('Paste').
1264: '" /> '.&Apache::loncommon::filedescription(
1.174 albertel 1265: (split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
1266: $env{'form.markedcopy_title'});
1.168 www 1267: if ($container eq 'page') {
1268: $r->print(<<PAGEINFO);
1.174 albertel 1269: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
1270: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168 www 1271: PAGEINFO
1272: } else {
1273: $r->print(<<FOLDERINFO);
1.174 albertel 1274: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168 www 1275: FOLDERINFO
1276: }
1277: $r->print('</form></p>');
1278: }
1.7 www 1279: }
1280: }
1.1 www 1281:
1.188 raeburn 1282: sub process_file_upload {
1.194 raeburn 1283: my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188 raeburn 1284: # upload a file, if present
1285: my $parseaction;
1.190 albertel 1286: if ($env{'form.parserflag'}) {
1.188 raeburn 1287: $parseaction = 'parse';
1288: }
1289: my $phase_status;
1290: my $folder=$env{'form.folder'};
1.194 raeburn 1291: if ($folder eq '') {
1.188 raeburn 1292: $folder='default';
1293: }
1.194 raeburn 1294: if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188 raeburn 1295: my $errtext='';
1296: my $fatal=0;
1297: my $container='sequence';
1298: if ($env{'form.pagepath'}) {
1299: $container='page';
1300: }
1301: ($errtext,$fatal)=
1302: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 ! albertel 1303: if ($#LONCAPA::map::order<1) {
! 1304: $LONCAPA::map::order[0]=1;
! 1305: $LONCAPA::map::resources[1]='';
1.188 raeburn 1306: }
1307: if ($fatal) {
1308: return 'failed';
1309: }
1310: my $destination = 'docs/';
1.194 raeburn 1311: if ($folder =~ /^supplemental/) {
1312: $destination = 'supplemental/';
1313: }
1314: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1315: $destination .= 'default/';
1.194 raeburn 1316: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1317: $destination .= $2.'/';
1.188 raeburn 1318: }
1319: # this is for a course, not a user, so set coursedoc flag
1320: # probably the only place in the system where this should be "1"
1.245 ! albertel 1321: my $newidx=&LONCAPA::map::getresidx();
1.188 raeburn 1322: $destination .= $newidx;
1.190 albertel 1323: my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
1324: $parseaction,$allfiles,
1325: $codebase);
1.188 raeburn 1326: my $ext='false';
1327: if ($url=~/^http\:\/\//) { $ext='true'; }
1328: $url=~s/\:/\:/g;
1329: my $comment=$env{'form.comment'};
1330: $comment=~s/\</\<\;/g;
1331: $comment=~s/\>/\>\;/g;
1332: $comment=~s/\:/\:/g;
1333: if ($folder=~/^supplemental/) {
1334: $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1335: $env{'user.domain'}.'___&&&___'.$comment;
1336: }
1337:
1.245 ! albertel 1338: $LONCAPA::map::resources[$newidx]=
! 1339: $comment.':'.$url.':'.$ext.':normal:res';
! 1340: $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190 albertel 1341: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1342: $folder.'.'.$container);
1.188 raeburn 1343: if ($fatal) {
1344: $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
1345: return 'failed';
1346: } else {
1347: if ($parseaction eq 'parse') {
1.190 albertel 1348: my $total_embedded = keys(%{$allfiles});
1.188 raeburn 1349: if ($total_embedded > 0) {
1350: my $num = 0;
1351: $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
1352: <form name="upload_embedded" action="/adm/coursedocs"
1353: method="post" enctype="multipart/form-data">
1354: <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" /> <input type="hidden" name="cmd" value="upload_embedded" />
1355: <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228 www 1356: <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188 raeburn 1357: <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1358: $$upload_output .= '<b>Upload embedded files</b>:<br />
1359: <table>';
1.190 albertel 1360: foreach my $embed_file (keys(%{$allfiles})) {
1.188 raeburn 1361: $$upload_output .= '<tr><td>'.$embed_file.
1.190 albertel 1362: '<input name="embedded_item_'.$num.'" type="file" />
1.228 www 1363: <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.188 raeburn 1364: my $attrib;
1365: if (@{$$allfiles{$embed_file}} > 1) {
1366: $attrib = join(':',@{$$allfiles{$embed_file}});
1367: } else {
1368: $attrib = $$allfiles{$embed_file}[0];
1369: }
1370: $$upload_output .=
1371: '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
1372: if (exists($$codebase{$embed_file})) {
1373: $$upload_output .=
1.228 www 1374: '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
1.188 raeburn 1375: }
1376: $$upload_output .= '</td></tr>';
1377: $num ++;
1378: }
1379: $phase_status = 'phasetwo';
1380: $$upload_output .= '</table><br />
1381: <input type ="submit" value="Complete upload" />
1382: </form>';
1383: } else {
1384: $$upload_output .= 'No embedded items identified<br />';
1385: }
1386: }
1387: }
1388: }
1389: return $phase_status;
1390: }
1391:
1392: sub process_secondary_uploads {
1393: my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
1394: my $folder=$env{'form.folder'};
1395: my $destination = 'docs/';
1.195 raeburn 1396: if ($folder =~ /^supplemental/) {
1397: $destination = 'supplemental/';
1398: }
1399: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1400: $destination .= 'default/';
1.195 raeburn 1401: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217 raeburn 1402: $destination .= $2.'/';
1.188 raeburn 1403: }
1404: $destination .= $newidx;
1405: my ($url,$filename);
1406: $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1407: ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
1408: return $filename;
1409: }
1410:
1.8 www 1411: # --------------------------------------------------------------- An entry line
1412:
1413: sub entryline {
1.112 raeburn 1414: my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.38 www 1415: $title=~s/\&colon\;/\:/g;
1416: $title=&HTML::Entities::encode(&HTML::Entities::decode(
1.228 www 1417: &unescape($title)),'"<>&\'');
1.38 www 1418: my $renametitle=$title;
1419: my $foldertitle=$title;
1.142 raeburn 1420: my $pagetitle=$title;
1.245 ! albertel 1421: my $orderidx=$LONCAPA::map::order[$index];
1.109 albertel 1422: if ($title=~ /^(\d+)___&&&___(\w+)___&&&___(\w+)___&&&___(.*)$/ ) {
1423: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
1424: $renametitle=$4;
1425: $title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
1426: &Apache::loncommon::plainname($2,$3).': <br />'.
1427: $foldertitle;
1428: }
1.222 albertel 1429: $renametitle=~s/\\/\\\\/g;
1.38 www 1430: $renametitle=~s/\"\;/\\\"/g;
1.8 www 1431: my $line='<tr>';
1432: # Edit commands
1.142 raeburn 1433: my $container;
1.120 www 1434: my $folderpath;
1.174 albertel 1435: if ($env{'form.folderpath'}) {
1.142 raeburn 1436: $container = 'sequence';
1.228 www 1437: $folderpath=&escape($env{'form.folderpath'});
1.174 albertel 1438: # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120 www 1439: }
1.156 albertel 1440: my ($pagepath,$pagesymb);
1.174 albertel 1441: if ($env{'form.pagepath'}) {
1.142 raeburn 1442: $container = 'page';
1.228 www 1443: $pagepath=&escape($env{'form.pagepath'});
1444: $pagesymb=&escape($env{'form.pagesymb'});
1.142 raeburn 1445: }
1.168 www 1446: my $cpinfo='';
1.174 albertel 1447: if ($env{'form.markedcopy_url'}) {
1.168 www 1448: $cpinfo='&markedcopy_url='.
1.228 www 1449: &escape($env{'form.markedcopy_url'}).
1.168 www 1450: '&markedcopy_title='.
1.228 www 1451: &escape($env{'form.markedcopy_title'});
1.168 www 1452: }
1.109 albertel 1453: if ($allowed) {
1.123 www 1454: my $incindex=$index+1;
1455: my $selectbox='';
1.168 www 1456: if (($folder!~/^supplemental/) &&
1.245 ! albertel 1457: ($#LONCAPA::map::order>0) &&
1.168 www 1458: ((split(/\:/,
1.245 ! albertel 1459: $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
1.168 www 1460: ne '') &&
1461: ((split(/\:/,
1.245 ! albertel 1462: $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1]
1.168 www 1463: ne '')) {
1.123 www 1464: $selectbox=
1.124 www 1465: '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123 www 1466: '<select name="newpos" onChange="this.form.submit()">';
1.245 ! albertel 1467: for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123 www 1468: if ($i==$incindex) {
1469: $selectbox.='<option value="" selected="1">('.$i.')</option>';
1470: } else {
1471: $selectbox.='<option value="'.$i.'">'.$i.'</option>';
1472: }
1473: }
1474: $selectbox.='</select>';
1475: }
1.119 www 1476: my %lt=&Apache::lonlocal::texthash(
1477: 'up' => 'Move Up',
1.109 albertel 1478: 'dw' => 'Move Down',
1479: 'rm' => 'Remove',
1.171 www 1480: 'ct' => 'Cut',
1.168 www 1481: 'rn' => 'Rename',
1482: 'cp' => 'Copy');
1.211 www 1483: my $nocopy=0;
1484: if ($url=~/\.(page|sequence)$/) {
1485: foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
1486: my ($title,$url,$ext,$type)=split(/\:/,$_);
1487: if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
1488: $nocopy=1;
1489: last;
1490: }
1491: }
1492: }
1493: my $copylink=' ';
1.174 albertel 1494: if ($env{'form.pagepath'}) {
1.211 www 1495: unless ($nocopy) {
1496: $copylink=(<<ENDCOPY);
1497: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
1498: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
1499: ENDCOPY
1500: }
1.142 raeburn 1501: $line.=(<<END);
1502: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174 albertel 1503: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
1504: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1505: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1506: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142 raeburn 1507: <input type="hidden" name="setparms" value="$orderidx" />
1508: <td><table border='0' cellspacing='2' cellpadding='0'>
1509: <tr><td bgcolor="#DDDDDD">
1.168 www 1510: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142 raeburn 1511: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1512: <tr><td bgcolor="#DDDDDD">
1.168 www 1513: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142 raeburn 1514: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1515: </table></td>
1516: <td>$selectbox
1517: </td><td bgcolor="#DDDDDD">
1.156 albertel 1518: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142 raeburn 1519: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171 www 1520: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1521: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.213 albertel 1522: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168 www 1523: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211 www 1524: $copylink
1.142 raeburn 1525: END
1526: } else {
1.211 www 1527: unless ($nocopy) {
1528: $copylink=(<<ENDCOPY);
1529: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
1530: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
1531: ENDCOPY
1532: }
1.142 raeburn 1533: $line.=(<<END);
1.121 www 1534: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174 albertel 1535: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1536: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1537: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122 www 1538: <input type="hidden" name="setparms" value="$orderidx" />
1.54 www 1539: <td><table border='0' cellspacing='2' cellpadding='0'>
1540: <tr><td bgcolor="#DDDDDD">
1.168 www 1541: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90 www 1542: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54 www 1543: <tr><td bgcolor="#DDDDDD">
1.168 www 1544: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90 www 1545: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123 www 1546: </table></td>
1547: <td>$selectbox
1548: </td><td bgcolor="#DDDDDD">
1.142 raeburn 1549: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90 www 1550: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171 www 1551: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
1552: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.142 raeburn 1553: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168 www 1554: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211 www 1555: $copylink
1.8 www 1556: END
1.142 raeburn 1557: }
1.8 www 1558: }
1.16 www 1559: # Figure out what kind of a resource this is
1560: my ($extension)=($url=~/\.(\w+)$/);
1561: my $uploaded=($url=~/^\/*uploaded\//);
1.97 albertel 1562: my $icon=&Apache::loncommon::icon($url);
1.17 www 1563: my $isfolder=0;
1.142 raeburn 1564: my $ispage=0;
1.114 albertel 1565: my $folderarg;
1.142 raeburn 1566: my $pagearg;
1567: my $pagefile;
1.16 www 1568: if ($uploaded) {
1.135 albertel 1569: if ($extension eq 'sequence') {
1570: $icon=$iconpath.'/folder_closed.gif';
1571: $url=~/$coursenum\/([\/\w]+)\.sequence$/;
1572: $url='/adm/coursedocs?';
1573: $folderarg=$1;
1574: $isfolder=1;
1.142 raeburn 1575: } elsif ($extension eq 'page') {
1576: $icon=$iconpath.'/page.gif';
1577: $url=~/$coursenum\/([\/\w]+)\.page$/;
1578: $pagearg=$1;
1579: $url='/adm/coursedocs?';
1580: $ispage=1;
1.135 albertel 1581: } else {
1582: &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
1583: }
1.16 www 1584: }
1.215 albertel 1585: $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142 raeburn 1586: if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113 albertel 1587: my $symb=&Apache::lonnet::symbclean(
1.50 www 1588: &Apache::lonnet::declutter('uploaded/'.
1.174 albertel 1589: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1590: $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50 www 1591: '.sequence').
1592: '___'.$residx.'___'.
1.113 albertel 1593: &Apache::lonnet::declutter($url));
1594: (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
1595: $url=&Apache::lonnet::clutter($url);
1.127 albertel 1596: if ($url=~/^\/*uploaded\//) {
1597: $url=~/\.(\w+)$/;
1598: my $embstyle=&Apache::loncommon::fileembstyle($1);
1599: if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
1600: $url='/adm/wrapper'.$url;
1601: } elsif ($embstyle eq 'ssi') {
1602: #do nothing with these
1603: } elsif ($url!~/\.(sequence|page)$/) {
1604: $url='/adm/coursedocs/showdoc'.$url;
1605: }
1.145 albertel 1606: } elsif ($url=~m|^/ext/|) {
1607: $url='/adm/wrapper'.$url;
1.127 albertel 1608: }
1.241 www 1609: if (&Apache::lonnet::symbverify($symb,$url)) {
1610: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1611: } else {
1612: $url='';
1613: }
1.152 albertel 1614: if ($container eq 'page') {
1.174 albertel 1615: my $symb=$env{'form.pagesymb'};
1.152 albertel 1616:
1617: $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228 www 1618: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152 albertel 1619: }
1.50 www 1620: }
1.120 www 1621: my $parameterset=' ';
1.216 albertel 1622: if ($isfolder || $extension eq 'sequence') {
1.228 www 1623: my $foldername=&escape($foldertitle);
1.174 albertel 1624: my $folderpath=$env{'form.folderpath'};
1.114 albertel 1625: if ($folderpath) { $folderpath.='&' };
1.242 www 1626: # Append randompick number, hidden, and encrypted with ":" to foldername,
1627: # so it gets transferred between levels
1.245 ! albertel 1628: $folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242 www 1629: 'parameter_randompick'))[0]
1.245 ! albertel 1630: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1631: 'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245 ! albertel 1632: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1633: 'parameter_encrypturl'))[0]=~/^yes$/i);
1.228 www 1634: $url.='folderpath='.&escape($folderpath).$cpinfo;
1.147 matthew 1635: $parameterset='<label>'.&mt('Randomly Pick: ').
1.165 www 1636: '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.245 ! albertel 1637: (&LONCAPA::map::getparameter($orderidx,
1.147 matthew 1638: 'parameter_randompick'))[0].
1.165 www 1639: '" />'.
1640: '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
1.147 matthew 1641:
1.114 albertel 1642: }
1.142 raeburn 1643: if ($ispage) {
1.228 www 1644: my $pagename=&escape($pagetitle);
1.142 raeburn 1645: my $pagepath;
1.174 albertel 1646: my $folderpath=$env{'form.folderpath'};
1.142 raeburn 1647: if ($folderpath) { $pagepath = $folderpath.'&' };
1648: $pagepath.=$pagearg.'&'.$pagename;
1.174 albertel 1649: my $symb=$env{'form.pagesymb'};
1.152 albertel 1650: if (!$symb) {
1651: my $path='uploaded/'.
1.174 albertel 1652: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1653: $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152 albertel 1654: $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
1655: $residx,
1656: $path.$pagearg.'.page');
1657: }
1.228 www 1658: $url.='pagepath='.&escape($pagepath).
1659: '&pagesymb='.&escape($symb).$cpinfo;
1.142 raeburn 1660: }
1.113 albertel 1661: $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
1662: '" border="0"></a></td>'.
1.241 www 1663: "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
1664: ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120 www 1665: if (($allowed) && ($folder!~/^supplemental/)) {
1666: my %lt=&Apache::lonlocal::texthash(
1667: 'hd' => 'Hidden',
1.165 www 1668: 'ec' => 'URL hidden');
1.122 www 1669: my $enctext=
1.245 ! albertel 1670: ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122 www 1671: my $hidtext=
1.245 ! albertel 1672: ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120 www 1673: $line.=(<<ENDPARMS);
1674: <td bgcolor="#BBBBFF"><font size='-2'>
1.165 www 1675: <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
1.149 albertel 1676: <td bgcolor="#BBBBFF"><font size='-2'>
1.165 www 1677: <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
1.120 www 1678: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
1679: ENDPARMS
1.119 www 1680: }
1.120 www 1681: $line.="</form></tr>";
1.8 www 1682: return $line;
1683: }
1684:
1.27 www 1685: # ---------------------------------------------------------------- tie the hash
1686:
1687: sub tiehash {
1.136 albertel 1688: my ($mode)=@_;
1.27 www 1689: $hashtied=0;
1.174 albertel 1690: if ($env{'request.course.fn'}) {
1.136 albertel 1691: if ($mode eq 'write') {
1.174 albertel 1692: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1693: &GDBM_WRCREAT(),0640)) {
1694: $hashtied=2;
1695: }
1696: } else {
1.174 albertel 1697: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1698: &GDBM_READER(),0640)) {
1.27 www 1699: $hashtied=1;
1.136 albertel 1700: }
1701: }
1.27 www 1702: }
1703: }
1704:
1705: sub untiehash {
1706: if ($hashtied) { untie %hash; }
1707: $hashtied=0;
1.221 albertel 1708: return OK;
1.27 www 1709: }
1710:
1.29 www 1711: # --------------------------------------------------------------- check on this
1712:
1713: sub checkonthis {
1714: my ($r,$url,$level,$title)=@_;
1.228 www 1715: $url=&unescape($url);
1.29 www 1716: $alreadyseen{$url}=1;
1717: $r->rflush();
1.41 www 1718: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108 albertel 1719: $r->print("\n<br />");
1.29 www 1720: for (my $i=0;$i<=$level*5;$i++) {
1721: $r->print(' ');
1722: }
1723: $r->print('<a href="'.$url.'" target="cat">'.
1724: ($title?$title:$url).'</a> ');
1725: if ($url=~/^\/res\//) {
1726: my $result=&Apache::lonnet::repcopy(
1727: &Apache::lonnet::filelocation('',$url));
1.172 raeburn 1728: if ($result eq 'ok') {
1.87 www 1729: $r->print('<font color="green">'.&mt('ok').'</font>');
1.29 www 1730: $r->rflush();
1.34 www 1731: &Apache::lonnet::countacc($url);
1732: $url=~/\.(\w+)$/;
1733: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
1734: $r->print('<br />');
1735: $r->rflush();
1736: for (my $i=0;$i<=$level*5;$i++) {
1737: $r->print(' ');
1738: }
1.84 www 1739: $r->print('- '.&mt('Rendering').': ');
1.170 www 1740: my ($errorcount,$warningcount)=split(/:/,
1741: &Apache::lonnet::ssi_body($url,
1.173 albertel 1742: ('grade_target'=>'web',
1743: 'return_only_error_and_warning_counts' => 1)));
1.170 www 1744: if (($errorcount) ||
1745: ($warningcount)) {
1746: if ($errorcount) {
1.98 www 1747: $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170 www 1748: $errorcount.' '.
1.87 www 1749: &mt('error(s)').'</b></font> ');
1.34 www 1750: }
1.170 www 1751: if ($warningcount) {
1.34 www 1752: $r->print('<font color="blue">'.
1.170 www 1753: $warningcount.' '.
1.84 www 1754: &mt('warning(s)').'</font>');
1.34 www 1755: }
1756: } else {
1.87 www 1757: $r->print('<font color="green">'.&mt('ok').'</font>');
1.34 www 1758: }
1759: $r->rflush();
1760: }
1.29 www 1761: my $dependencies=
1762: &Apache::lonnet::metadata($url,'dependencies');
1763: foreach (split(/\,/,$dependencies)) {
1764: if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
1765: &checkonthis($r,$_,$level+1);
1766: }
1767: }
1.172 raeburn 1768: } elsif ($result eq 'unavailable') {
1.84 www 1769: $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172 raeburn 1770: } elsif ($result eq 'not_found') {
1.100 www 1771: unless ($url=~/\$/) {
1772: $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
1773: } else {
1774: $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
1775: }
1.29 www 1776: } else {
1.84 www 1777: $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29 www 1778: }
1779: }
1780: }
1781: }
1782:
1.1 www 1783:
1.75 www 1784: #
1.208 albertel 1785: # ----------------------------------------------------------------- List Symbs
1786: #
1787: sub list_symbs {
1.224 albertel 1788: my ($r) = @_;
1789:
1790: $r->print(&Apache::loncommon::start_page('Symb List'));
1791: my $navmap = Apache::lonnavmaps::navmap->new();
1792: $r->print("<pre>\n");
1793: foreach my $res ($navmap->retrieveResources()) {
1794: $r->print($res->compTitle()."\t".$res->symb()."\n");
1795: }
1796: $r->print("\n</pre>\n");
1797: $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208 albertel 1798: }
1799:
1800:
1801: #
1.75 www 1802: # -------------------------------------------------------------- Verify Content
1803: #
1804: sub verifycontent {
1.224 albertel 1805: my ($r) = @_;
1.230 albertel 1806: my $type = &Apache::loncommon::course_type();
1.26 www 1807: my $loaderror=&Apache::lonnet::overloaderror($r);
1808: if ($loaderror) { return $loaderror; }
1.229 raeburn 1809: $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.27 www 1810: $hashtied=0;
1.30 www 1811: undef %alreadyseen;
1812: %alreadyseen=();
1.27 www 1813: &tiehash();
1814: foreach (keys %hash) {
1.140 www 1815: if ($hash{$_}=~/\.(page|sequence)$/) {
1.228 www 1816: if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140 www 1817: $r->print('<hr /><font color="red">'.
1.230 albertel 1818: &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228 www 1819: &unescape($hash{$_}).'</font><br />'.
1.140 www 1820: &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
1821: }
1822: }
1.228 www 1823: if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29 www 1824: &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27 www 1825: }
1826: }
1827: &untiehash();
1.108 albertel 1828: $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
1829: &mt('Return to DOCS').'</a>');
1.75 www 1830: }
1831:
1.192 www 1832:
1.75 www 1833: # -------------------------------------------------------------- Check Versions
1834:
1.192 www 1835: sub devalidateversioncache {
1836: my $src=shift;
1837: &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
1838: &Apache::lonnet::clutter($src));
1839: }
1840:
1.75 www 1841: sub checkversions {
1.224 albertel 1842: my ($r) = @_;
1.230 albertel 1843: my $type = &Apache::loncommon::course_type();
1.229 raeburn 1844: $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.89 www 1845: my $header='';
1846: my $startsel='';
1847: my $monthsel='';
1848: my $weeksel='';
1849: my $daysel='';
1850: my $allsel='';
1851: my %changes=();
1852: my $starttime=0;
1.91 www 1853: my $haschanged=0;
1.92 www 1854: my %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 1855: $env{'course.'.$env{'request.course.id'}.'.domain'},
1856: $env{'course.'.$env{'request.course.id'}.'.num'});
1.92 www 1857:
1858: $hashtied=0;
1859: &tiehash();
1860: my %newsetversions=();
1.174 albertel 1861: if ($env{'form.setmostrecent'}) {
1.91 www 1862: $haschanged=1;
1.92 www 1863: foreach (keys %hash) {
1864: if ($_=~/^ids\_(\/res\/.+)$/) {
1.93 www 1865: $newsetversions{$1}='mostrecent';
1.192 www 1866: &devalidateversioncache($1);
1.92 www 1867: }
1868: }
1.174 albertel 1869: } elsif ($env{'form.setcurrent'}) {
1.91 www 1870: $haschanged=1;
1.92 www 1871: foreach (keys %hash) {
1872: if ($_=~/^ids\_(\/res\/.+)$/) {
1.93 www 1873: my $getvers=&Apache::lonnet::getversion($1);
1874: if ($getvers>0) {
1875: $newsetversions{$1}=$getvers;
1.192 www 1876: &devalidateversioncache($1);
1.93 www 1877: }
1.92 www 1878: }
1879: }
1.174 albertel 1880: } elsif ($env{'form.setversions'}) {
1.91 www 1881: $haschanged=1;
1.174 albertel 1882: foreach (keys %env) {
1.92 www 1883: if ($_=~/^form\.set_version_(.+)$/) {
1884: my $src=$1;
1.174 albertel 1885: if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
1886: $newsetversions{$src}=$env{$_};
1.192 www 1887: &devalidateversioncache($src);
1.92 www 1888: }
1889: }
1890: }
1.91 www 1891: }
1892: if ($haschanged) {
1.92 www 1893: if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174 albertel 1894: $env{'course.'.$env{'request.course.id'}.'.domain'},
1895: $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
1.92 www 1896: $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
1897: } else {
1898: $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
1899: }
1.136 albertel 1900: &mark_hash_old();
1.91 www 1901: }
1.136 albertel 1902: &changewarning($r,'');
1.174 albertel 1903: if ($env{'form.timerange'} eq 'all') {
1.89 www 1904: # show all documents
1.230 albertel 1905: $header=&mt('All Documents in '.$type);
1.91 www 1906: $allsel=1;
1.90 www 1907: foreach (keys %hash) {
1908: if ($_=~/^ids\_(\/res\/.+)$/) {
1909: my $src=$1;
1910: $changes{$src}=1;
1911: }
1912: }
1.89 www 1913: } else {
1914: # show documents which changed
1915: %changes=&Apache::lonnet::dump
1.174 albertel 1916: ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
1917: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 1918: my $firstkey=(keys %changes)[0];
1919: unless ($firstkey=~/^error\:/) {
1.174 albertel 1920: unless ($env{'form.timerange'}) {
1921: $env{'form.timerange'}=604800;
1.89 www 1922: }
1.174 albertel 1923: my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89 www 1924: .&mt('seconds');
1.174 albertel 1925: if ($env{'form.timerange'}==-1) {
1.89 www 1926: $seltext='since start of course';
1927: $startsel='selected';
1.174 albertel 1928: $env{'form.timerange'}=time;
1.89 www 1929: }
1.174 albertel 1930: $starttime=time-$env{'form.timerange'};
1931: if ($env{'form.timerange'}==2592000) {
1.89 www 1932: $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
1933: $monthsel='selected';
1.174 albertel 1934: } elsif ($env{'form.timerange'}==604800) {
1.89 www 1935: $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
1936: $weeksel='selected';
1.174 albertel 1937: } elsif ($env{'form.timerange'}==86400) {
1.89 www 1938: $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
1939: $daysel='selected';
1940: }
1941: $header=&mt('Content changed').' '.$seltext;
1942: } else {
1943: $header=&mt('No content modifications yet.');
1944: }
1945: }
1.92 www 1946: %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 1947: $env{'course.'.$env{'request.course.id'}.'.domain'},
1948: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 1949: my %lt=&Apache::lonlocal::texthash
1.229 raeburn 1950: ('st' => 'Version changes since start of '.$type,
1.88 www 1951: 'lm' => 'Version changes since last Month',
1952: 'lw' => 'Version changes since last Week',
1953: 'sy' => 'Version changes since Yesterday',
1.91 www 1954: 'al' => 'All Resources (possibly large output)',
1.88 www 1955: 'sd' => 'Display',
1.84 www 1956: 'fi' => 'File',
1957: 'md' => 'Modification Date',
1.87 www 1958: 'mr' => 'Most recently published Version',
1.229 raeburn 1959: 've' => 'Version used in '.$type,
1960: 'vu' => 'Set Version to be used in '.$type,
1961: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91 www 1962: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
1963: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84 www 1964: 'di' => 'Differences');
1.89 www 1965: $r->print(<<ENDHEADERS);
1.31 www 1966: <form action="/adm/coursedocs" method="post">
1.91 www 1967: <input type="hidden" name="versions" value="1" />
1968: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
1969: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31 www 1970: <select name="timerange">
1.88 www 1971: <option value='all' $allsel>$lt{'al'}</option>
1.84 www 1972: <option value="-1" $startsel>$lt{'st'}</option>
1973: <option value="2592000" $monthsel>$lt{'lm'}</option>
1974: <option value="604800" $weeksel>$lt{'lw'}</option>
1975: <option value="86400" $daysel>$lt{'sy'}</option>
1.31 www 1976: </select>
1.91 www 1977: <input type="submit" name="display" value="$lt{'sd'}" />
1.89 www 1978: <h3>$header</h3>
1.91 www 1979: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103 matthew 1980: <table border="0">
1.31 www 1981: ENDHEADERS
1.91 www 1982: foreach (sort keys %changes) {
1.89 www 1983: if ($changes{$_}>$starttime) {
1984: my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
1985: my $currentversion=&Apache::lonnet::getversion($_);
1.93 www 1986: if ($currentversion<0) {
1987: $currentversion=&mt('Could not be determined.');
1988: }
1.89 www 1989: my $linkurl=&Apache::lonnet::clutter($_);
1990: $r->print(
1.103 matthew 1991: '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91 www 1992: &Apache::lonnet::gettitle($linkurl).
1.103 matthew 1993: '</b></font></td></tr>'.
1994: '<tr><td> </td>'.
1995: '<td colspan="4">'.
1996: '<a href="'.$linkurl.'" target="cat">'.$linkurl.
1997: '</a></td></tr>'.
1998: '<tr><td></td>'.
1999: '<td title="'.$lt{'md'}.'">'.
1.102 matthew 2000: &Apache::lonlocal::locallocaltime(
2001: &Apache::lonnet::metadata($root.'.'.$extension,
2002: 'lastrevisiondate')
2003: ).
1.103 matthew 2004: '</td>'.
2005: '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
2006: '<font size="+1">'.$currentversion.'</font>'.
2007: '</nobr></td>'.
1.229 raeburn 2008: '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103 matthew 2009: '<font size="+1">');
1.87 www 2010: # Used in course
1.89 www 2011: my $usedversion=$hash{'version_'.$linkurl};
1.93 www 2012: if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89 www 2013: $r->print($usedversion);
2014: } else {
2015: $r->print($currentversion);
2016: }
1.103 matthew 2017: $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
2018: '<nobr>Use: ');
1.87 www 2019: # Set version
1.92 www 2020: $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89 www 2021: 'set_version_'.$linkurl,
1.136 albertel 2022: ('select_form_order' =>
2023: ['',1..$currentversion,'mostrecent'],
2024: '' => '',
1.93 www 2025: 'mostrecent' => 'most recent',
1.89 www 2026: map {$_,$_} (1..$currentversion))));
1.103 matthew 2027: $r->print('</nobr></td></tr><tr><td></td>');
1.89 www 2028: my $lastold=1;
2029: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
2030: my $url=$root.'.'.$prevvers.'.'.$extension;
2031: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
2032: $starttime) {
2033: $lastold=$prevvers;
2034: }
2035: }
1.103 matthew 2036: #
2037: # Code to figure out how many version entries should go in
2038: # each of the four columns
2039: my $entries_per_col = 0;
2040: my $num_entries = ($currentversion-$lastold);
2041: if ($num_entries % 4 == 0) {
2042: $entries_per_col = $num_entries/4;
2043: } else {
2044: $entries_per_col = $num_entries/4 + 1;
2045: }
2046: my $entries_count = 0;
2047: $r->print('<td valign="top"><font size="-2">');
2048: my $cols_output = 1;
1.32 www 2049: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89 www 2050: my $url=$root.'.'.$prevvers.'.'.$extension;
1.103 matthew 2051: $r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91 www 2052: '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103 matthew 2053: &Apache::lonlocal::locallocaltime(
2054: &Apache::lonnet::metadata($url,
2055: 'lastrevisiondate')
2056: ).
1.91 www 2057: ')');
1.89 www 2058: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33 www 2059: $r->print(' <a href="/adm/diff?filename='.
1.89 www 2060: &Apache::lonnet::clutter($root.'.'.$extension).
2061: '&versionone='.$prevvers.
2062: '">'.&mt('Diffs').'</a>');
2063: }
1.103 matthew 2064: $r->print('</nobr><br />');
2065: if (++$entries_count % $entries_per_col == 0) {
2066: $r->print('</font></td>');
2067: if ($cols_output != 4) {
2068: $r->print('<td valign="top"><font size="-2">');
2069: $cols_output++;
2070: }
2071: }
1.89 www 2072: }
1.103 matthew 2073: while($cols_output++ < 4) {
2074: $r->print('</font></td><td><font>')
2075: }
2076: $r->print('</font></td></tr>'."\n");
1.89 www 2077: }
2078: }
1.92 www 2079: $r->print('</table></form>');
1.89 www 2080: $r->print('<h1>'.&mt('Done').'.</h1>');
2081:
2082: &untiehash();
1.75 www 2083: }
2084:
1.136 albertel 2085: sub mark_hash_old {
2086: my $retie_hash=0;
2087: if ($hashtied) {
2088: $retie_hash=1;
2089: &untiehash();
2090: }
2091: &tiehash('write');
2092: $hash{'old'}=1;
2093: &untiehash();
2094: if ($retie_hash) { &tiehash(); }
2095: }
2096:
2097: sub is_hash_old {
2098: my $untie_hash=0;
2099: if (!$hashtied) {
2100: $untie_hash=1;
2101: &tiehash();
2102: }
2103: my $return=$hash{'old'};
2104: if ($untie_hash) { &untiehash(); }
2105: return $return;
2106: }
2107:
1.91 www 2108: sub changewarning {
1.177 albertel 2109: my ($r,$postexec,$message,$url)=@_;
1.136 albertel 2110: if (!&is_hash_old()) { return; }
1.150 albertel 2111: my $pathvar='folderpath';
1.228 www 2112: my $path=&escape($env{'form.folderpath'});
1.177 albertel 2113: if (!defined($url)) {
2114: if (defined($env{'form.pagepath'})) {
2115: $pathvar='pagepath';
1.228 www 2116: $path=&escape($env{'form.pagepath'});
2117: $path.='&pagesymb='.&escape($env{'form.pagesymb'});
1.177 albertel 2118: }
2119: $url='/adm/coursedocs?'.$pathvar.'='.$path;
2120: }
1.230 albertel 2121: my $course_type = &Apache::loncommon::course_type();
1.177 albertel 2122: if (!defined($message)) {
2123: $message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150 albertel 2124: }
1.185 www 2125: $r->print("\n\n".
2126: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n".
2127: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177 albertel 2128: '<input type="hidden" name="orgurl" value="'.$url.
1.117 albertel 2129: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177 albertel 2130: &mt($message,' <input type="hidden" name="'.
2131: $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230 albertel 2132: &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185 www 2133: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91 www 2134: }
2135:
1.75 www 2136: # ================================================================ Main Handler
2137: sub handler {
2138: my $r = shift;
1.82 www 2139: &Apache::loncommon::content_type($r,'text/html');
1.75 www 2140: $r->send_http_header;
2141: return OK if $r->header_only;
1.230 albertel 2142: my $type = &Apache::loncommon::course_type();
1.75 www 2143:
2144: # --------------------------------------------- Initialize help topics for this
1.209 albertel 2145: foreach ('Adding_Course_Doc','Main_Course_Documents',
2146: 'Adding_External_Resource','Navigate_Content',
2147: 'Adding_Folders','Docs_Overview', 'Load_Map',
2148: 'Supplemental','Score_Upload_Form','Adding_Pages',
2149: 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
2150: 'Check_Resource_Versions','Verify_Content') {
2151: $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
2152: }
1.75 www 2153: # Composite help files
2154: $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
2155: 'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
2156: $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
2157: 'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86 albertel 2158: $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
2159: 'Option_Response_Simple');
1.75 www 2160: $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
2161: 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
2162: $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
2163: 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
2164: $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142 raeburn 2165:
1.209 albertel 2166: # does this user have privileges to modify docs
2167: my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
2168:
2169: if ($allowed && $env{'form.verify'}) {
1.75 www 2170: &verifycontent($r);
1.209 albertel 2171: } elsif ($allowed && $env{'form.listsymbs'}) {
1.208 albertel 2172: &list_symbs($r);
1.209 albertel 2173: } elsif ($allowed && $env{'form.versions'}) {
1.75 www 2174: &checkversions($r);
1.209 albertel 2175: } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75 www 2176: &dumpcourse($r);
1.209 albertel 2177: } elsif ($allowed && $env{'form.exportcourse'}) {
1.138 raeburn 2178: &exportcourse($r);
1.26 www 2179: } else {
1.7 www 2180: # is this a standard course?
2181:
1.174 albertel 2182: my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155 raeburn 2183: my $forcestandard = 0;
1.15 www 2184: my $forcesupplement;
2185: my $script='';
1.19 www 2186: my $showdoc=0;
1.142 raeburn 2187: my $containertag;
2188: my $uploadtag;
1.15 www 2189: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224 albertel 2190: ['folderpath','pagepath',
2191: 'pagesymb','markedcopy_url',
2192: 'markedcopy_title']);
1.174 albertel 2193: if ($env{'form.folderpath'}) {
2194: my (@folderpath)=split('&',$env{'form.folderpath'});
1.228 www 2195: $env{'form.foldername'}=&unescape(pop(@folderpath));
1.174 albertel 2196: $env{'form.folder'}=pop(@folderpath);
2197: }
2198: if ($env{'form.pagepath'}) {
2199: my (@pagepath)=split('&',$env{'form.pagepath'});
1.228 www 2200: $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174 albertel 2201: $env{'form.folder'}=pop(@pagepath);
1.156 albertel 2202: $containertag = '<input type="hidden" name="pagepath" value="" />'.
2203: '<input type="hidden" name="pagesymb" value="" />';
1.174 albertel 2204: $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
2205: '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142 raeburn 2206: }
1.21 www 2207: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127 albertel 2208: $showdoc='/'.$1;
1.21 www 2209: }
2210: unless ($showdoc) { # got called from remote
1.237 albertel 2211: if (($env{'form.folder'}=~/^(?:group|default)_/) ||
1.209 albertel 2212: ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155 raeburn 2213: $forcestandard = 1;
2214: }
1.174 albertel 2215: $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7 www 2216:
1.15 www 2217: if ($allowed) {
2218: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
2219: $script=&Apache::lonratedt::editscript('simple');
2220: }
2221: } else { # got called in sequence from course
2222: $allowed=0;
1.3 www 2223: }
1.4 www 2224:
2225: # get course data
1.174 albertel 2226: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
2227: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4 www 2228:
1.225 albertel 2229: # get personal data
1.174 albertel 2230: my $uname=$env{'user.name'};
2231: my $udom=$env{'user.domain'};
1.245 ! albertel 2232: my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14 www 2233:
1.8 www 2234: # graphics settings
1.4 www 2235:
1.176 albertel 2236: $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8 www 2237:
1.224 albertel 2238: if ($allowed) {
2239: $script .= &editing_js($udom,$uname);
1.171 www 2240: }
1.42 www 2241: # -------------------------------------------------------------------- Body tag
1.224 albertel 2242: $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229 raeburn 2243: $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225 albertel 2244: {'force_register' => $showdoc,}).
1.233 albertel 2245: &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224 albertel 2246:
1.188 raeburn 2247: my %allfiles = ();
2248: my %codebase = ();
2249: my ($upload_result,$upload_output);
2250: if ($allowed) {
2251: if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) {
2252: # Process file upload - phase one - upload and parse primary file.
1.190 albertel 2253: $upload_result = &process_file_upload(\$upload_output,$coursenum,
2254: $coursedom,\%allfiles,
1.194 raeburn 2255: \%codebase,$1);
1.188 raeburn 2256: if ($upload_result eq 'phasetwo') {
2257: $r->print($upload_output);
2258: }
2259: } elsif ($env{'form.phasetwo'}) {
2260: my %newname = ();
2261: my %origname = ();
2262: my %attribs = ();
2263: my $updateflag = 0;
2264: my $residx = $env{'form.newidx'};
1.228 www 2265: my $primary_url = &unescape($env{'form.primaryurl'});
1.188 raeburn 2266: # Process file upload - phase two - gather secondary files.
2267: for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
2268: if ($env{'form.embedded_item_'.$i.'.filename'}) {
2269: my $javacodebase;
2270: $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228 www 2271: $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188 raeburn 2272: if (exists($env{'form.embedded_codebase_'.$i})) {
1.228 www 2273: $javacodebase = &unescape($env{'form.embedded_codebase_'.$i});
1.188 raeburn 2274: $origname{$i} =~ s#^\Q$javacodebase\E/##;
2275: }
2276: my @attributes = ();
2277: if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
2278: @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
2279: } else {
2280: @attributes = ($env{'form.embedded_attrib_'.$i});
2281: }
2282: foreach (@attributes) {
1.228 www 2283: push(@{$attribs{$i}},&unescape($_));
1.188 raeburn 2284: }
2285: if ($javacodebase) {
2286: $codebase{$i} = $javacodebase;
2287: $codebase{$i} =~ s#/$##;
2288: $updateflag = 1;
2289: }
2290: }
2291: unless ($newname{$i} eq $origname{$i}) {
2292: $updateflag = 1;
2293: }
2294: }
2295: # Process file upload - phase three - modify primary file
2296: if ($updateflag) {
2297: my ($content,$rtncode);
2298: my $updateflag = 0;
2299: my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
2300: if ($getstatus eq 'ok') {
2301: foreach my $item (keys %newname) {
2302: if ($newname{$item} ne $origname{$item}) {
2303: my $attrib_regexp = '';
2304: if (@{$attribs{$item}} > 1) {
2305: $attrib_regexp = join('|',@{$attribs{$item}});
2306: } else {
2307: $attrib_regexp = $attribs{$item}[0];
2308: }
2309: if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
2310: }
2311: $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi;
2312: }
2313: if (exists($codebase{$item})) {
1.224 albertel 2314: $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188 raeburn 2315: }
2316: }
2317: # Save edited file.
2318: my $saveresult;
2319: my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
2320: my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191 raeburn 2321: my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188 raeburn 2322: } else {
2323: &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus);
2324: }
2325: }
2326: }
2327: }
2328:
2329: unless ($showdoc || $upload_result eq 'phasetwo') {
1.81 www 2330: # -----------------------------------------------------------------------------
2331: my %lt=&Apache::lonlocal::texthash(
1.229 raeburn 2332: 'uplm' => 'Upload a new main '.lc($type).' document',
2333: 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168 www 2334: 'impp' => 'Import a document',
2335: 'pubd' => 'Published documents',
1.181 www 2336: 'copm' => 'All documents out of a published map into this folder',
1.81 www 2337: 'spec' => 'Special documents',
2338: 'upld' => 'Upload Document',
2339: 'srch' => 'Search',
2340: 'impo' => 'Import',
1.232 www 2341: 'book' => 'Import Bookmarks',
1.81 www 2342: 'selm' => 'Select Map',
2343: 'load' => 'Load Map',
1.186 www 2344: 'reco' => 'Recover Deleted Resources',
1.81 www 2345: 'newf' => 'New Folder',
1.142 raeburn 2346: 'newp' => 'New Composite Page',
1.81 www 2347: 'extr' => 'External Resource',
2348: 'syll' => 'Syllabus',
2349: 'navc' => 'Navigate Contents',
2350: 'sipa' => 'Simple Page',
2351: 'sipr' => 'Simple Problem',
1.219 www 2352: 'drbx' => 'Drop Box',
1.81 www 2353: 'scuf' => 'Score Upload Form',
2354: 'bull' => 'Bulletin Board',
1.96 sakharuk 2355: 'mypi' => 'My Personal Info',
1.101 www 2356: 'abou' => 'About User',
1.110 raeburn 2357: 'imsf' => 'Import IMS package',
1.96 sakharuk 2358: 'file' => 'File',
2359: 'title' => 'Title',
1.188 raeburn 2360: 'comment' => 'Comment',
2361: 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81 www 2362: );
2363: # -----------------------------------------------------------------------------
1.42 www 2364: if ($allowed) {
1.74 www 2365: my $dumpbut=&dumpbutton();
1.138 raeburn 2366: my $exportbut=&exportbutton();
1.88 www 2367: my %lt=&Apache::lonlocal::texthash(
2368: 'vc' => 'Verify Content',
2369: 'cv' => 'Check/Set Resource Versions',
1.208 albertel 2370: 'ls' => 'List Symbs',
1.88 www 2371: );
1.118 albertel 2372:
1.174 albertel 2373: my $folderpath=$env{'form.folderpath'};
1.118 albertel 2374: if (!$folderpath) {
1.174 albertel 2375: if ($env{'form.folder'} eq '' ||
2376: $env{'form.folder'} eq 'supplemental') {
1.118 albertel 2377: $folderpath='default&'.
1.230 albertel 2378: &escape(&mt('Main '.$type.' Documents'));
1.118 albertel 2379: }
2380: }
1.174 albertel 2381: unless ($env{'form.pagepath'}) {
1.142 raeburn 2382: $containertag = '<input type="hidden" name="folderpath" value="" />';
2383: $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
2384: }
2385:
1.42 www 2386: $r->print(<<ENDCOURSEVERIFY);
1.36 www 2387: <form name="renameform" method="post" action="/adm/coursedocs">
2388: <input type="hidden" name="title" />
2389: <input type="hidden" name="cmd" />
1.168 www 2390: <input type="hidden" name="markcopy" />
1.142 raeburn 2391: $containertag
1.36 www 2392: </form>
1.39 www 2393: <form name="simpleedit" method="post" action="/adm/coursedocs">
2394: <input type=hidden name="importdetail" value="">
1.142 raeburn 2395: $uploadtag
1.39 www 2396: </form>
1.26 www 2397: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74 www 2398: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
2399: <tr><td bgcolor="#DDDDCC">
1.130 www 2400: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74 www 2401: </td><td bgcolor="#DDDDCC">
1.130 www 2402: <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74 www 2403: $dumpbut
1.138 raeburn 2404: $exportbut
1.218 albertel 2405: </td><td bgcolor="#DDDDCC">
1.208 albertel 2406: <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.218 albertel 2407: </td></tr></table>
1.25 www 2408: </form>
2409: ENDCOURSEVERIFY
1.74 www 2410: $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230 albertel 2411: &mt('Editing the Table of Contents for your '.$type)));
1.25 www 2412: }
1.17 www 2413: # --------------------------------------------------------- Standard documents
1.43 www 2414: $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7 www 2415: if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116 albertel 2416: $r->print('<tr><td bgcolor="#BBBBBB">');
2417: # '<h2>'.&mt('Main Course Documents').
2418: # ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174 albertel 2419: my $folder=$env{'form.folder'};
1.117 albertel 2420: if ($folder eq '' || $folder eq 'supplemental') {
1.112 raeburn 2421: $folder='default';
1.230 albertel 2422: $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112 raeburn 2423: }
1.51 www 2424: my $postexec='';
2425: if ($folder eq 'default') {
2426: $r->print('<script>this.window.name="loncapaclient";</script>');
2427: } else {
1.117 albertel 2428: #$postexec='self.close();';
1.51 www 2429: }
1.40 www 2430: $hadchanges=0;
1.188 raeburn 2431: &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40 www 2432: if ($hadchanges) {
1.136 albertel 2433: &mark_hash_old()
1.40 www 2434: }
1.136 albertel 2435: &changewarning($r,$postexec);
1.16 www 2436: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2437: '.sequence';
1.142 raeburn 2438: my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2439: '.page';
1.186 www 2440: my $container='sequence';
2441: if ($env{'form.pagepath'}) {
2442: $container='page';
2443: }
2444: my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8 www 2445: $r->print(<<ENDFORM);
1.43 www 2446: <table cellspacing=4 cellpadding=4><tr>
1.81 www 2447: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
2448: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
2449: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11 www 2450: </tr>
1.16 www 2451: <tr><td bgcolor="#DDDDDD">
1.96 sakharuk 2452: $lt{'file'}:<br />
1.182 albertel 2453: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59 www 2454: <input type="file" name="uploaddoc" size="40">
1.8 www 2455: <br />
1.96 sakharuk 2456: $lt{'title'}:<br />
1.11 www 2457: <input type="text" size="50" name="comment">
1.142 raeburn 2458: $uploadtag
1.10 www 2459: <input type="hidden" name="cmd" value="upload_default">
1.188 raeburn 2460: <br />
2461: <nobr>
1.190 albertel 2462: <label>$lt{'parse'}?
1.188 raeburn 2463: <input type="checkbox" name="parserflag" />
1.190 albertel 2464: </label>
1.188 raeburn 2465: </nobr>
2466: <br />
2467: <br />
1.129 albertel 2468: <nobr>
1.81 www 2469: <input type="submit" value="$lt{'upld'}">
1.60 albertel 2470: $help{'Uploading_From_Harddrive'}
1.58 albertel 2471: </nobr>
1.60 albertel 2472: </form>
1.11 www 2473: </td>
1.16 www 2474: <td bgcolor="#DDDDDD">
1.39 www 2475: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168 www 2476: $lt{'pubd'}<br />
1.142 raeburn 2477: $uploadtag
1.232 www 2478: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
2479: <br />
1.58 albertel 2480: <nobr>
1.232 www 2481: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58 albertel 2482: $help{'Importing_LON-CAPA_Resource'}
2483: </nobr>
1.232 www 2484: <br />
2485: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59 www 2486: <p>
2487: <hr />
1.181 www 2488: $lt{'copm'}<br />
2489: <input type="text" size="40" name="importmap"><br />
1.68 bowersj2 2490: <nobr><input type=button
1.52 www 2491: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81 www 2492: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68 bowersj2 2493: $help{'Load_Map'}</nobr>
1.59 www 2494: </p>
1.52 www 2495: </form>
1.186 www 2496: <hr />
2497: <form action="/adm/groupsort" method="post" name="recover">
1.232 www 2498: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186 www 2499: </form>
1.142 raeburn 2500: ENDFORM
1.174 albertel 2501: unless ($env{'form.pagepath'}) {
1.168 www 2502: $r->print(<<ENDFORM);
2503: <hr />
2504: <form action="/adm/coursedocs" method="post" name="newext">
2505: $uploadtag
2506: <input type=hidden name="importdetail" value="">
2507: <nobr>
2508: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
2509: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
2510: </nobr>
2511: </form>
1.214 www 2512: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168 www 2513: <input type="hidden" name="folder" value="$folder" />
2514: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
2515: </nobr>
2516: </form>
2517: ENDFORM
2518: }
2519: $r->print('</td><td bgcolor="#DDDDDD">');
1.174 albertel 2520: unless ($env{'form.pagepath'}) {
1.142 raeburn 2521: $r->print(<<ENDFORM);
1.214 www 2522: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174 albertel 2523: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13 www 2524: <input type=hidden name="importdetail" value="">
1.58 albertel 2525: <nobr>
1.16 www 2526: <input name="newfolder" type="button"
2527: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2528: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58 albertel 2529: </nobr>
1.11 www 2530: </form>
1.214 www 2531: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174 albertel 2532: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142 raeburn 2533: <input type=hidden name="importdetail" value="">
2534: <nobr>
2535: <input name="newpage" type="button"
2536: onClick="javascript:makenewpage(this.form,'$pageseq');"
2537: value="$lt{'newp'}" />$help{'Adding_Pages'}
2538: </nobr>
2539: </form>
1.214 www 2540: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142 raeburn 2541: $uploadtag
1.14 www 2542: <input type=hidden name="importdetail"
2543: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58 albertel 2544: <nobr>
1.81 www 2545: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2546: $help{'Syllabus'}
1.58 albertel 2547: </nobr>
2548: </form>
1.214 www 2549: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142 raeburn 2550: $uploadtag
1.15 www 2551: <input type=hidden name="importdetail"
2552: value="Navigate Content=/adm/navmaps">
1.58 albertel 2553: <nobr>
1.81 www 2554: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47 www 2555: $help{'Navigate_Content'}
1.58 albertel 2556: </nobr>
1.22 www 2557: </form>
1.214 www 2558: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142 raeburn 2559: $uploadtag
1.22 www 2560: <input type=hidden name="importdetail" value="">
1.58 albertel 2561: <nobr>
1.81 www 2562: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65 bowersj2 2563: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58 albertel 2564: </nobr>
1.55 www 2565: </form>
1.214 www 2566: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142 raeburn 2567: $uploadtag
1.55 www 2568: <input type=hidden name="importdetail" value="">
1.58 albertel 2569: <nobr>
1.81 www 2570: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65 bowersj2 2571: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62 www 2572: </nobr>
2573: </form>
1.219 www 2574: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
2575: $uploadtag
2576: <input type=hidden name="importdetail" value="">
2577: <nobr>
2578: <input name="newdropbox" type="button" value="$lt{'drbx'}"
2579: onClick="javascript:makedropbox();" />
2580: </nobr>
2581: </form>
1.214 www 2582: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 2583: $uploadtag
1.62 www 2584: <input type=hidden name="importdetail" value="">
2585: <nobr>
1.81 www 2586: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62 www 2587: onClick="javascript:makeexamupload();" />
1.66 bowersj2 2588: $help{'Score_Upload_Form'}
1.58 albertel 2589: </nobr>
1.22 www 2590: </form>
1.214 www 2591: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142 raeburn 2592: $uploadtag
1.22 www 2593: <input type=hidden name="importdetail" value="">
1.58 albertel 2594: <nobr>
1.81 www 2595: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22 www 2596: onClick="javascript:makebulboard();" />
1.65 bowersj2 2597: $help{'Bulletin Board'}
1.58 albertel 2598: </nobr>
2599: </form>
1.214 www 2600: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142 raeburn 2601: $uploadtag
1.14 www 2602: <input type=hidden name="importdetail"
2603: value="$plainname=/adm/$udom/$uname/aboutme">
1.58 albertel 2604: <nobr>
1.81 www 2605: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 2606: $help{'My Personal Info'}
1.101 www 2607: </nobr>
2608: </form>
1.214 www 2609: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142 raeburn 2610: $uploadtag
1.101 www 2611: <input type=hidden name="importdetail" value="">
2612: <nobr>
2613: <input name="newaboutsomeone" type="button" value="$lt{'abou'}"
2614: onClick="javascript:makeabout();" />
1.110 raeburn 2615: </nobr>
1.182 albertel 2616: </form>
1.142 raeburn 2617: ENDFORM
2618: }
1.174 albertel 2619: if ($env{'form.pagepath'}) {
1.142 raeburn 2620: $r->print(<<ENDBLOCK);
2621: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
2622: $uploadtag
2623: <input type=hidden name="importdetail" value="">
2624: <nobr>
2625: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
2626: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
2627: </nobr>
2628: </form>
1.214 www 2629: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 2630: $uploadtag
2631: <input type=hidden name="importdetail" value="">
2632: <nobr>
2633: <input name="newexamupload" type="button" value="$lt{'scuf'}"
2634: onClick="javascript:makeexamupload();" />
2635: $help{'Score_Upload_Form'}
2636: </nobr>
1.182 albertel 2637: </form>
1.142 raeburn 2638: ENDBLOCK
2639: }
2640: $r->print('</td></tr>'."\n".
2641: '</table>');
1.24 www 2642: $r->print('</td></tr>');
1.7 www 2643: }
2644: # ----------------------------------------------------- Supplemental documents
2645: if (!$forcestandard) {
1.116 albertel 2646: $r->print('<tr><td bgcolor="#BBBBBB">');
2647: # '<h2>'.&mt('Supplemental Course Documents').
2648: # ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174 albertel 2649: my $folder=$env{'form.folder'};
1.117 albertel 2650: unless ($folder=~/^supplemental/) {
1.116 albertel 2651: $folder='supplemental';
1.117 albertel 2652: }
2653: if ($folder =~ /^supplemental$/ &&
1.174 albertel 2654: $env{'form.folderpath'} =~ /^default\&/) {
2655: $env{'form.folderpath'}='supplemental&'.
1.230 albertel 2656: &escape(&mt('Supplemental '.$type.' Documents'));
1.116 albertel 2657: }
1.7 www 2658: &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8 www 2659: if ($allowed) {
1.17 www 2660: my $folderseq=
2661: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
2662: '.sequence';
2663:
1.8 www 2664: $r->print(<<ENDSUPFORM);
1.43 www 2665: <table cellspacing=4 cellpadding=4><tr>
1.81 www 2666: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
2667: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17 www 2668: </tr>
2669: <tr><td bgcolor="#DDDDDD">
1.10 www 2670: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59 www 2671: <input type="file" name="uploaddoc" size="40">
1.196 raeburn 2672: <br />
2673: <br />
2674: <nobr>
2675: <label>$lt{'parse'}?
2676: <input type="checkbox" name="parserflag" />
2677: </label>
2678: </nobr>
2679: <br /><br />
2680: $lt{'comment'}:<br />
1.4 www 2681: <textarea cols=50 rows=4 name='comment'>
2682: </textarea>
1.115 albertel 2683: <br />
1.174 albertel 2684: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10 www 2685: <input type="hidden" name="cmd" value="upload_supplemental">
1.58 albertel 2686: <nobr>
1.81 www 2687: <input type="submit" value="$lt{'upld'}">
1.58 albertel 2688: $help{'Uploading_From_Harddrive'}
2689: </nobr>
2690: </form>
1.17 www 2691: </td>
2692: <td bgcolor="#DDDDDD">
1.18 www 2693: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174 albertel 2694: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2695: <input type=hidden name="importdetail" value="">
1.58 albertel 2696: <nobr>
1.17 www 2697: <input name="newfolder" type="button"
2698: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2699: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58 albertel 2700: </nobr>
1.17 www 2701: </form>
1.214 www 2702: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174 albertel 2703: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2704: <input type=hidden name="importdetail" value="">
1.58 albertel 2705: <nobr>
1.18 www 2706: <input name="newext" type="button"
2707: onClick="javascript:makenewext('supnewext');"
1.81 www 2708: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58 albertel 2709: </nobr>
1.17 www 2710: </form>
1.214 www 2711: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174 albertel 2712: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2713: <input type=hidden name="importdetail"
2714: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58 albertel 2715: <nobr>
1.81 www 2716: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2717: $help{'Syllabus'}
1.58 albertel 2718: </nobr>
2719: </form>
1.214 www 2720: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174 albertel 2721: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2722: <input type=hidden name="importdetail"
2723: value="$plainname=/adm/$udom/$uname/aboutme">
1.58 albertel 2724: <nobr>
1.81 www 2725: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 2726: $help{'My Personal Info'}
1.58 albertel 2727: </nobr>
2728: </form>
1.17 www 2729: </td></tr>
1.24 www 2730: </table></td></tr>
1.8 www 2731: ENDSUPFORM
2732: }
1.7 www 2733: }
1.18 www 2734: if ($allowed) {
1.182 albertel 2735: $r->print('<form method="POST" name="extimport" action="/adm/coursedocs"><input type="hidden" name="title" /><input type="hidden" name="url" /><input type="hidden" name="useform" /></form>');
1.18 www 2736: }
1.24 www 2737: $r->print('</table>');
1.19 www 2738: } else {
1.188 raeburn 2739: unless ($upload_result eq 'phasetwo') {
1.19 www 2740: # -------------------------------------------------------- This is showdoc mode
1.188 raeburn 2741: $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141 albertel 2742: &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81 www 2743: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188 raeburn 2744: &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
2745: }
1.19 www 2746: }
1.26 www 2747: }
1.224 albertel 2748: $r->print(&Apache::loncommon::end_page());
1.26 www 2749: return OK;
1.1 www 2750: }
2751:
1.224 albertel 2752:
2753: sub editing_js {
2754: my ($udom,$uname) = @_;
2755: my $now = time();
2756:
2757: return <<ENDNEWSCRIPT;
2758: function makenewfolder(targetform,folderseq) {
2759: var foldername=prompt('Name of New Folder','New Folder');
2760: if (foldername) {
1.236 albertel 2761: targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224 albertel 2762: targetform.submit();
2763: }
2764: }
2765:
2766: function makenewpage(targetform,folderseq) {
2767: var pagename=prompt('Name of New Page','New Page');
2768: if (pagename) {
1.236 albertel 2769: targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224 albertel 2770: targetform.submit();
2771: }
2772: }
2773:
2774: function makenewext(targetname) {
2775: this.document.forms.extimport.useform.value=targetname;
2776: window.open('/adm/rat/extpickframe.html');
2777: }
2778:
2779: function makeexamupload() {
2780: var title=prompt('Listed Title for the Uploaded Score');
2781: if (title) {
2782: this.document.forms.newexamupload.importdetail.value=
1.236 albertel 2783: escape(title)+'=/res/lib/templates/examupload.problem';
1.224 albertel 2784: this.document.forms.newexamupload.submit();
2785: }
2786: }
2787:
2788: function makesmppage() {
2789: var title=prompt('Listed Title for the Page');
2790: if (title) {
2791: this.document.forms.newsmppg.importdetail.value=
1.236 albertel 2792: escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224 albertel 2793: this.document.forms.newsmppg.submit();
2794: }
2795: }
2796:
2797: function makesmpproblem() {
2798: var title=prompt('Listed Title for the Problem');
2799: if (title) {
2800: this.document.forms.newsmpproblem.importdetail.value=
1.236 albertel 2801: escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224 albertel 2802: this.document.forms.newsmpproblem.submit();
2803: }
2804: }
2805:
2806: function makedropbox() {
2807: var title=prompt('Listed Title for the Drop Box');
2808: if (title) {
2809: this.document.forms.newdropbox.importdetail.value=
1.236 albertel 2810: escape(title)+'=/res/lib/templates/DropBox.problem';
1.224 albertel 2811: this.document.forms.newdropbox.submit();
2812: }
2813: }
2814:
2815: function makebulboard() {
2816: var title=prompt('Listed Title for the Bulletin Board');
2817: if (title) {
2818: this.document.forms.newbul.importdetail.value=
1.236 albertel 2819: escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224 albertel 2820: this.document.forms.newbul.submit();
2821: }
2822: }
2823:
2824: function makeabout() {
1.236 albertel 2825: var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224 albertel 2826: if (user) {
2827: var comp=new Array();
1.236 albertel 2828: comp=user.split(':');
1.224 albertel 2829: if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
2830: if ((comp[0]) && (comp[1])) {
2831: this.document.forms.newaboutsomeone.importdetail.value=
1.236 albertel 2832: 'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224 albertel 2833: this.document.forms.newaboutsomeone.submit();
2834: } else {
1.236 albertel 2835: alert("Not a valid user:domain");
1.224 albertel 2836: }
2837: } else {
1.236 albertel 2838: alert("Please enter both user and domain in the format user:domain");
1.224 albertel 2839: }
2840: }
2841: }
2842:
2843: function makeims() {
2844: var caller = document.forms.ims.folder.value;
2845: var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
2846: newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
2847: newWindow.location.href = newlocation;
2848: }
2849:
2850:
2851: function finishpick() {
2852: var title=this.document.forms.extimport.title.value;
2853: var url=this.document.forms.extimport.url.value;
2854: var form=this.document.forms.extimport.useform.value;
2855: eval
2856: ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
2857: '";this.document.forms.'+form+'.submit();');
2858: }
2859:
2860: function changename(folderpath,index,oldtitle,container,pagesymb) {
2861: var title=prompt('New Title',oldtitle);
2862: if (title) {
2863: this.document.forms.renameform.title.value=title;
2864: this.document.forms.renameform.cmd.value='rename_'+index;
2865: if (container == 'sequence') {
2866: this.document.forms.renameform.folderpath.value=folderpath;
2867: }
2868: if (container == 'page') {
2869: this.document.forms.renameform.pagepath.value=folderpath;
2870: this.document.forms.renameform.pagesymb.value=pagesymb;
2871: }
2872: this.document.forms.renameform.submit();
2873: }
2874: }
2875:
2876: function removeres(folderpath,index,oldtitle,container,pagesymb) {
2877: if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
2878: this.document.forms.renameform.cmd.value='del_'+index;
2879: if (container == 'sequence') {
2880: this.document.forms.renameform.folderpath.value=folderpath;
2881: }
2882: if (container == 'page') {
2883: this.document.forms.renameform.pagepath.value=folderpath;
2884: this.document.forms.renameform.pagesymb.value=pagesymb;
2885: }
2886: this.document.forms.renameform.submit();
2887: }
2888: }
2889:
2890: function cutres(folderpath,index,oldtitle,container,pagesymb) {
2891: if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
2892: this.document.forms.renameform.cmd.value='cut_'+index;
2893: this.document.forms.renameform.markcopy.value=index;
2894: if (container == 'sequence') {
2895: this.document.forms.renameform.folderpath.value=folderpath;
2896: }
2897: if (container == 'page') {
2898: this.document.forms.renameform.pagepath.value=folderpath;
2899: this.document.forms.renameform.pagesymb.value=pagesymb;
2900: }
2901: this.document.forms.renameform.submit();
2902: }
2903: }
2904:
2905: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
2906: this.document.forms.renameform.markcopy.value=index;
2907: if (container == 'sequence') {
2908: this.document.forms.renameform.folderpath.value=folderpath;
2909: }
2910: if (container == 'page') {
2911: this.document.forms.renameform.pagepath.value=folderpath;
2912: this.document.forms.renameform.pagesymb.value=pagesymb;
2913: }
2914: this.document.forms.renameform.submit();
2915: }
2916:
2917: ENDNEWSCRIPT
2918: }
1.1 www 2919: 1;
2920: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>