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