Annotation of loncom/interface/londocs.pm, revision 1.321

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>