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