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