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

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.324   ! raeburn     4: # $Id: londocs.pm,v 1.323 2008/12/15 06:32:01 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;
1.323     raeburn  1283: 	my $newid=$$.int(rand(100)).time;
1.322     raeburn  1284: 	my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
                   1285:         if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) {
                   1286:             my $path = $1;
                   1287:             my $prefix = $2;
                   1288:             my $ancestor = $3;
                   1289:             if (length($ancestor) > 10) {
                   1290:                 $ancestor = substr($ancestor,-10,10);
                   1291:             }
                   1292:             $oldid = $path.$prefix.$ancestor;
                   1293:         }
                   1294:         my $counter = 0;
                   1295:         my $newurl=$oldid.$newid.'.'.$ext;
                   1296:         my $is_unique = &uniqueness_check($newurl);
                   1297:         while (!$is_unique && $counter < 100) {
                   1298:             $counter ++;
                   1299:             $newid ++;
                   1300:             $newurl = $oldid.$newid;
                   1301:             $is_unique = &uniqueness_check($newurl);
                   1302:         }
                   1303:         if (!$is_unique) {
                   1304:             if ($url=~/\.page$/) {
                   1305:                 return &mt('Paste failed: an error occurred creating a unique URL for the composite page');
                   1306:             } else {
                   1307:                 return &mt('Paste failed: an error occurred creating a unique URL for the folder');
                   1308:             }
                   1309:         }
1.289     albertel 1310: 	my $storefn=$newurl;
                   1311: 	$storefn=~s{^/\w+/$match_domain/$match_username/}{};
1.321     raeburn  1312: 	my $paste_map_result =
                   1313:             &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
                   1314: 					       &Apache::lonnet::getfile($url));
                   1315:         if ($paste_map_result eq '/adm/notfound.html') {
                   1316:             if ($url=~/\.page$/) {
                   1317:                 return &mt('Paste failed: an error occurred saving the composite page');
                   1318:             } else {
                   1319:                 return &mt('Paste failed: an error occurred saving the folder');
                   1320:             }
                   1321:         }
1.289     albertel 1322: 	$url = $newurl;
                   1323:     }
1.290     albertel 1324: # published maps can only exists once, so remove it from paste buffer when done
1.289     albertel 1325:     if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) {
                   1326: 	&Apache::lonnet::delenv('docs\\.markedcopy');
                   1327:     }
1.290     albertel 1328:     if ($url=~ m{/smppg$}) {
                   1329: 	my $db_name = &Apache::lonsimplepage::get_db_name($url);
                   1330: 	if ($db_name =~ /^smppage_/) {
                   1331: 	    #simple pages, need to copy the db contents to a new one.
                   1332: 	    my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
                   1333: 	    my $now = time();
                   1334: 	    $db_name =~ s{_\d*$ }{_$now}x;
                   1335: 	    my $result=&Apache::lonnet::put($db_name,\%contents,
                   1336: 					    $coursedom,$coursenum);
                   1337: 	    $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; 
                   1338: 	    $title=&mt('Copy of').' '.$title;
                   1339: 	}
                   1340:     }
1.289     albertel 1341:     $title = &LONCAPA::map::qtunescape($title);
                   1342:     my $ext='false';
                   1343:     if ($url=~m{^http(|s)://}) { $ext='true'; }
                   1344:     $url       = &LONCAPA::map::qtunescape($url);
                   1345: # Now insert the URL at the bottom
                   1346:     my $newidx = &LONCAPA::map::getresidx($url);
1.311     raeburn  1347:     if ($env{'docs.markedcopy_supplemental'}) {
                   1348:         if ($folder =~ /^supplemental/) {
                   1349:             $title = $env{'docs.markedcopy_supplemental'};
                   1350:         } else {
                   1351:             (undef,undef,$title) = 
                   1352:                 &parse_supplemental_title($env{'docs.markedcopy_supplemental'});
                   1353:         }
                   1354:     } else {
                   1355:         if ($folder=~/^supplemental/) {
                   1356:            $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1357:                   $env{'user.domain'}.'___&&&___'.$title;
                   1358:         }
                   1359:     }
                   1360: 
1.289     albertel 1361:     $LONCAPA::map::resources[$newidx]= 	$title.':'.$url.':'.$ext.':normal:res';
                   1362:     push(@LONCAPA::map::order, $newidx);
1.321     raeburn  1363:     return 'ok';
1.289     albertel 1364: # Store the result
1.292     albertel 1365: }
                   1366: 
1.322     raeburn  1367: sub uniqueness_check {
                   1368:     my ($newurl) = @_;
                   1369:     my $unique = 1;
                   1370:     foreach my $res (@LONCAPA::map::order) {
                   1371:         my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
                   1372:         $url=&LONCAPA::map::qtescape($url);
                   1373:         if ($newurl eq $url) {
                   1374:             $unique = 0;
                   1375:             last;    
                   1376:         }
                   1377:     }
                   1378:     return $unique;
                   1379: }
                   1380: 
1.292     albertel 1381: my %parameter_type = ( 'randompick'     => 'int_pos',
                   1382: 		       'hiddenresource' => 'string_yesno',
1.296     albertel 1383: 		       'encrypturl'     => 'string_yesno',
                   1384: 		       'randomorder'    => 'string_yesno',);
1.292     albertel 1385: my $valid_parameters_re = join('|',keys(%parameter_type));
                   1386: # set parameters
                   1387: sub update_parameter {
                   1388: 
                   1389:     return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
                   1390: 
                   1391:     my $which = $env{'form.changeparms'};
                   1392:     my $idx = $env{'form.setparms'};
                   1393:     if ($env{'form.'.$which.'_'.$idx}) {
                   1394: 	my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}
                   1395: 	                                     : 'yes';
                   1396: 	&LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
                   1397: 				      $parameter_type{$which});
                   1398: 	&remember_parms($idx,$which,'set',$value);
                   1399:     } else {
                   1400: 	&LONCAPA::map::delparameter($idx,'parameter_'.$which);
                   1401: 	
                   1402: 	&remember_parms($idx,$which,'del');
                   1403:     }
                   1404:     return 1;
                   1405: }
                   1406: 
                   1407: 
                   1408: sub handle_edit_cmd {
                   1409:     my ($coursenum,$coursedom) =@_;
                   1410: 
                   1411:     my ($cmd,$idx)=split('_',$env{'form.cmd'});
                   1412: 
                   1413:     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
                   1414:     my ($title, $url, @rrest) = split(':', $ratstr);
                   1415: 
                   1416:     if ($cmd eq 'del') {
                   1417: 	if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
                   1418: 	    ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
                   1419: 	    &Apache::lonnet::removeuploadedurl($url);
                   1420: 	} else {
                   1421: 	    &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
                   1422: 	}
                   1423: 	splice(@LONCAPA::map::order, $idx, 1);
                   1424: 
                   1425:     } elsif ($cmd eq 'cut') {
                   1426: 	&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
                   1427: 	splice(@LONCAPA::map::order, $idx, 1);
                   1428: 
                   1429:     } elsif ($cmd eq 'up' 
                   1430: 	     && ($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
                   1431: 	@LONCAPA::map::order[$idx-1,$idx] = @LONCAPA::map::order[$idx,$idx-1];
                   1432: 
                   1433:     } elsif ($cmd eq 'down'
                   1434: 	     && defined($LONCAPA::map::order[$idx+1])) {
                   1435: 	@LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];
                   1436: 
                   1437:     } elsif ($cmd eq 'rename') {
                   1438: 
                   1439: 	my $comment = &LONCAPA::map::qtunescape($env{'form.title'});
                   1440: 	if ($comment=~/\S/) {
                   1441: 	    $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
                   1442: 		$comment.':'.join(':', $url, @rrest);
                   1443: 	}
                   1444: # Devalidate title cache
                   1445: 	my $renamed_url=&LONCAPA::map::qtescape($url);
                   1446: 	&Apache::lonnet::devalidate_title_cache($renamed_url);
                   1447:     } else {
                   1448: 	return 0;
                   1449:     }
                   1450:     return 1;
1.289     albertel 1451: }
                   1452: 
1.7       www      1453: sub editor {
1.309     raeburn  1454:     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_;
1.292     albertel 1455: 
                   1456:     my $container= ($env{'form.pagepath'}) ? 'page'
                   1457: 		                           : 'sequence';
                   1458: 
                   1459:     my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                   1460: 				    $folder.'.'.$container);
                   1461:     return $errtext if ($fatal);
                   1462: 
1.245     albertel 1463:     if ($#LONCAPA::map::order<1) {
                   1464: 	my $idx=&LONCAPA::map::getresidx();
1.178     www      1465: 	if ($idx<=0) { $idx=1; }
1.245     albertel 1466:        	$LONCAPA::map::order[0]=$idx;
                   1467:         $LONCAPA::map::resources[$idx]='';
1.17      www      1468:     }
1.281     albertel 1469:     
1.296     albertel 1470:     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=
1.309     raeburn  1471: 	&breadcrumbs($folder,$allowed,$type);
1.242     www      1472:     $r->print($breadcrumbtrail);
1.292     albertel 1473:     
1.7       www      1474: # ------------------------------------------------------------ Process commands
1.121     www      1475: 
1.16      www      1476: # ---------------- if they are for this folder and user allowed to make changes
1.292     albertel 1477:     if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123     www      1478: # set parameters and change order
1.292     albertel 1479: 	&snapshotbefore();
                   1480: 
                   1481: 	if (&update_parameter()) {
                   1482: 	    ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1483: 	    return $errtext if ($fatal);
                   1484: 	}
1.121     www      1485: 
1.292     albertel 1486: 	if ($env{'form.newpos'} && $env{'form.currentpos'}) {
1.123     www      1487: # change order
1.292     albertel 1488: 	    my $res = splice(@LONCAPA::map::order,$env{'form.currentpos'}-1,1);
                   1489: 	    splice(@LONCAPA::map::order,$env{'form.newpos'}-1,0,$res);
                   1490: 
                   1491: 	    ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1492: 	    return $errtext if ($fatal);
                   1493: 	}
                   1494: 	    
                   1495: 	if ($env{'form.pastemarked'}) {
1.321     raeburn  1496:             my $paste_res = 
                   1497:                 &do_paste_from_buffer($coursenum,$coursedom,$folder);
                   1498:             if ($paste_res eq 'ok') {
                   1499:                 ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1500:                 return $errtext if ($fatal);
                   1501:             } elsif ($paste_res ne '') {
                   1502:                 $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');
                   1503:             }
1.292     albertel 1504: 	}
                   1505: 
                   1506: 	$r->print($upload_output);
                   1507: 
                   1508: 	if (&handle_edit_cmd()) {
                   1509: 	    ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1510: 	    return $errtext if ($fatal);
                   1511: 	}
                   1512: # Group import/search
                   1513: 	if ($env{'form.importdetail'}) {
                   1514: 	    my @imports;
1.320     raeburn  1515: 	    foreach my $item (split(/\&/,$env{'form.importdetail'})) {
                   1516: 		if (defined($item)) {
1.292     albertel 1517: 		    my ($name,$url,$residx)=
1.320     raeburn  1518: 			map {&unescape($_)} split(/\=/,$item);
1.292     albertel 1519: 		    push(@imports, [$name, $url, $residx]);
1.123     www      1520: 		}
1.247     www      1521: 	    }
1.292     albertel 1522: 	    ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
                   1523: 					    $container,'londocs',@imports);
                   1524: 	    return $errtext if ($fatal);
                   1525: 	}
                   1526: # Loading a complete map
                   1527: 	if ($env{'form.loadmap'}) {
                   1528: 	    if ($env{'form.importmap'}=~/\w/) {
                   1529: 		foreach my $res (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                   1530: 		    my ($title,$url,$ext,$type)=split(/\:/,$res);
                   1531: 		    my $idx=&LONCAPA::map::getresidx($url);
                   1532: 		    $LONCAPA::map::resources[$idx]=$res;
                   1533: 		    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.168     www      1534: 		}
1.104     albertel 1535: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1536: 					    $folder.'.'.$container);
1.292     albertel 1537: 		return $errtext if ($fatal);
                   1538: 	    } else {
                   1539: 		$r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');
                   1540: 		
                   1541: 	    }
1.281     albertel 1542: 	}
1.292     albertel 1543: 	&log_differences($plain);
                   1544:     }
1.16      www      1545: # ---------------------------------------------------------------- End commands
1.7       www      1546: # ---------------------------------------------------------------- Print screen
1.292     albertel 1547:     my $idx=0;
                   1548:     my $shown=0;
1.296     albertel 1549:     if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {
1.292     albertel 1550: 	$r->print('<p>'.&mt('Parameters').':<ul>'.
                   1551: 		  ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
                   1552: 		  ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
                   1553: 		  ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
                   1554: 		  '</ul></p>');
                   1555:     }                                                                                                     
                   1556:     if ($randompick>=0) {
                   1557: 	$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>');
                   1558:     }
1.296     albertel 1559:     if ($is_random_order) {
                   1560: 	$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>');
                   1561:     }
1.292     albertel 1562:     $r->print('<table class="LC_docs_editor">');
                   1563:     foreach my $res (@LONCAPA::map::order) {
                   1564: 	my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
                   1565: 	$name=&LONCAPA::map::qtescape($name);
                   1566: 	$url=&LONCAPA::map::qtescape($url);
                   1567: 	unless ($name) {  $name=(split(/\//,$url))[-1]; }
                   1568: 	unless ($name) { $idx++; next; }
                   1569: 	$r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
                   1570: 			     $coursenum));
                   1571: 	$idx++;
                   1572: 	$shown++;
                   1573:     }
                   1574:     unless ($shown) {
                   1575: 	$r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
1.7       www      1576:     }
1.292     albertel 1577:     $r->print("\n</table>\n");
1.310     raeburn  1578:     if ($allowed) {
                   1579:         &print_paste_buffer($r,$container);
                   1580:     }
1.292     albertel 1581:     return;
1.7       www      1582: }
1.1       www      1583: 
1.188     raeburn  1584: sub process_file_upload {
1.194     raeburn  1585:     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188     raeburn  1586: # upload a file, if present
                   1587:     my $parseaction;
1.190     albertel 1588:    if ($env{'form.parserflag'}) {
1.188     raeburn  1589:         $parseaction = 'parse';
                   1590:     }
                   1591:     my $phase_status;
                   1592:     my $folder=$env{'form.folder'};
1.194     raeburn  1593:     if ($folder eq '') {
1.188     raeburn  1594:         $folder='default';
                   1595:     }
1.194     raeburn  1596:     if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188     raeburn  1597:         my $errtext='';
                   1598:         my $fatal=0;
                   1599:         my $container='sequence';
                   1600:         if ($env{'form.pagepath'}) {
                   1601:             $container='page';
                   1602:         }
                   1603:         ($errtext,$fatal)=
                   1604:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1605:         if ($#LONCAPA::map::order<1) {
                   1606:             $LONCAPA::map::order[0]=1;
                   1607:             $LONCAPA::map::resources[1]='';
1.188     raeburn  1608:         }
                   1609:         if ($fatal) {
                   1610:             return 'failed';
                   1611:         }
                   1612:         my $destination = 'docs/';
1.194     raeburn  1613:         if ($folder =~ /^supplemental/) {
                   1614:             $destination = 'supplemental/';
                   1615:         }
                   1616:         if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1617:             $destination .= 'default/';
1.194     raeburn  1618:         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
                   1619:             $destination .=  $2.'/';
1.188     raeburn  1620:         }
                   1621: # this is for a course, not a user, so set coursedoc flag
                   1622: # probably the only place in the system where this should be "1"
1.245     albertel 1623:         my $newidx=&LONCAPA::map::getresidx();
1.188     raeburn  1624:         $destination .= $newidx;
1.190     albertel 1625:         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
                   1626: 						$parseaction,$allfiles,
                   1627: 						$codebase);
1.188     raeburn  1628:         my $ext='false';
1.287     albertel 1629:         if ($url=~m{^http://}) { $ext='true'; }
1.270     albertel 1630: 	$url     = &LONCAPA::map::qtunescape($url);
1.188     raeburn  1631:         my $comment=$env{'form.comment'};
1.270     albertel 1632: 	$comment = &LONCAPA::map::qtunescape($comment);
1.188     raeburn  1633:         if ($folder=~/^supplemental/) {
                   1634:               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1635:                   $env{'user.domain'}.'___&&&___'.$comment;
                   1636:         }
                   1637: 
1.245     albertel 1638:         $LONCAPA::map::resources[$newidx]=
                   1639: 	    $comment.':'.$url.':'.$ext.':normal:res';
                   1640:         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190     albertel 1641:         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
                   1642: 				    $folder.'.'.$container);
1.188     raeburn  1643:         if ($fatal) {
1.283     albertel 1644:             $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>';
1.188     raeburn  1645:             return 'failed';
                   1646:         } else {
                   1647:             if ($parseaction eq 'parse') {
1.190     albertel 1648:                 my $total_embedded = keys(%{$allfiles});
1.188     raeburn  1649:                 if ($total_embedded > 0) {
                   1650:                     my $num = 0;
1.269     albertel 1651: 		    my $state = '
1.282     albertel 1652:    <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
1.269     albertel 1653:    <input type="hidden" name="cmd" value="upload_embedded" />
1.188     raeburn  1654:    <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228     www      1655:    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188     raeburn  1656:    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1.269     albertel 1657: 		    $phase_status = 'phasetwo';
                   1658: 
                   1659:                     $$upload_output .= 
                   1660: 			'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
1.308     raeburn  1661: 			&Apache::loncommon::ask_for_embedded_content(
                   1662:                             '/adm/coursedocs',$state,$allfiles,$codebase);
1.188     raeburn  1663:                 } else {
                   1664:                     $$upload_output .= 'No embedded items identified<br />';
                   1665:                 }
                   1666:             }
                   1667:         }
                   1668:     }
                   1669:     return $phase_status;
                   1670: }
                   1671: 
                   1672: sub process_secondary_uploads {
                   1673:     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
                   1674:     my $folder=$env{'form.folder'};
                   1675:     my $destination = 'docs/';
1.195     raeburn  1676:     if ($folder =~ /^supplemental/) {
                   1677:         $destination = 'supplemental/';
                   1678:     }
                   1679:     if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1680:         $destination .= 'default/';
1.195     raeburn  1681:     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217     raeburn  1682:         $destination .=  $2.'/';
1.188     raeburn  1683:     }
                   1684:     $destination .= $newidx;
                   1685:     my ($url,$filename);
                   1686:     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1.265     albertel 1687:     ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
1.188     raeburn  1688:     return $filename;
                   1689: }
                   1690: 
1.281     albertel 1691: sub is_supplemental_title {
                   1692:     my ($title) = @_;
                   1693:     return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
                   1694: }
                   1695: 
                   1696: sub parse_supplemental_title {
                   1697:     my ($title) = @_;
                   1698: 
                   1699:     my ($foldertitle,$renametitle);
                   1700:     if ($title =~ /&amp;&amp;&amp;/) {
                   1701: 	$title = &HTML::Entites::decode($title);
                   1702:     }
                   1703:  if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) {
                   1704: 	$renametitle=$4;
                   1705: 	my ($time,$uname,$udom) = ($1,$2,$3);
                   1706: 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
                   1707: 	my $name =  &Apache::loncommon::plainname($uname,$udom);
                   1708: 	$name = &HTML::Entities::encode($name,'"<>&\'');
                   1709: 	$title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.
                   1710: 	    $name.': <br />'.$foldertitle;
                   1711:     }
                   1712:     if (wantarray) {
                   1713: 	return ($title,$foldertitle,$renametitle);
                   1714:     } 
                   1715:     return $title;
                   1716: }
                   1717: 
1.8       www      1718: # --------------------------------------------------------------- An entry line
                   1719: 
                   1720: sub entryline {
1.112     raeburn  1721:     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.281     albertel 1722: 
                   1723:     my ($foldertitle,$pagetitle,$renametitle);
                   1724:     if (&is_supplemental_title($title)) {
                   1725: 	($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
                   1726: 	$pagetitle = $foldertitle;
                   1727:     } else {
                   1728: 	$title=&HTML::Entities::encode($title,'"<>&\'');
                   1729: 	$renametitle=$title;
                   1730: 	$foldertitle=$title;
                   1731: 	$pagetitle=$title;
                   1732:     }
                   1733: 
1.245     albertel 1734:     my $orderidx=$LONCAPA::map::order[$index];
1.281     albertel 1735:     
                   1736: 
1.222     albertel 1737:     $renametitle=~s/\\/\\\\/g;
1.38      www      1738:     $renametitle=~s/\&quot\;/\\\"/g;
1.286     albertel 1739:     $renametitle=~s/ /%20/g;
1.8       www      1740:     my $line='<tr>';
1.286     albertel 1741:     my ($form_start,$form_end);
1.8       www      1742: # Edit commands
1.280     albertel 1743:     my ($container, $type, $esc_path, $path, $symb);
1.174     albertel 1744:     if ($env{'form.folderpath'}) {
1.280     albertel 1745: 	$type = 'folder';
1.142     raeburn  1746:         $container = 'sequence';
1.282     albertel 1747: 	$esc_path=&escape($env{'form.folderpath'});
                   1748: 	$path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.174     albertel 1749: 	# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120     www      1750:     }
1.174     albertel 1751:     if ($env{'form.pagepath'}) {
1.280     albertel 1752:         $type = $container = 'page';
                   1753:         $esc_path=&escape($path = $env{'form.pagepath'});
1.282     albertel 1754: 	$path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
1.280     albertel 1755:         $symb=&escape($env{'form.pagesymb'});
1.142     raeburn  1756:     }
1.168     www      1757:     my $cpinfo='';
1.109     albertel 1758:     if ($allowed) {
1.123     www      1759: 	my $incindex=$index+1;
                   1760: 	my $selectbox='';
1.168     www      1761: 	if (($folder!~/^supplemental/) &&
1.245     albertel 1762: 	    ($#LONCAPA::map::order>0) && 
1.168     www      1763: 	    ((split(/\:/,
1.245     albertel 1764: 	     $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] 
1.168     www      1765: 	     ne '') && 
                   1766: 	    ((split(/\:/,
1.245     albertel 1767: 	     $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1] 
1.168     www      1768: 	     ne '')) {
1.123     www      1769: 	    $selectbox=
1.124     www      1770: 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123     www      1771: 		'<select name="newpos" onChange="this.form.submit()">';
1.245     albertel 1772: 	    for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123     www      1773: 		if ($i==$incindex) {
                   1774: 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
                   1775: 		} else {
                   1776: 		    $selectbox.='<option value="'.$i.'">'.$i.'</option>';
                   1777: 		}
                   1778: 	    }
                   1779: 	    $selectbox.='</select>';
                   1780: 	}
1.119     www      1781: 	my %lt=&Apache::lonlocal::texthash(
                   1782:                 'up' => 'Move Up',
1.109     albertel 1783: 		'dw' => 'Move Down',
                   1784: 		'rm' => 'Remove',
1.171     www      1785:                 'ct' => 'Cut',
1.168     www      1786: 		'rn' => 'Rename',
                   1787: 		'cp' => 'Copy');
1.211     www      1788: 	my $nocopy=0;
1.268     www      1789:         my $nocut=0;
1.211     www      1790:         if ($url=~/\.(page|sequence)$/) {
1.289     albertel 1791: 	    if ($url =~ m{/res/}) {
                   1792: 		# no copy for published maps
                   1793: 		$nocopy = 1;
                   1794: 	    } else {
1.320     raeburn  1795: 		foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
                   1796: 		    my ($title,$url,$ext,$type)=split(/\:/,$item);
1.289     albertel 1797: 		    if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                   1798: 			$nocopy=1;
                   1799: 			last;
                   1800: 		    }
1.211     www      1801: 		}
                   1802: 	    }
                   1803: 	}
1.268     www      1804:         if ($url=~/^\/res\/lib\/templates\//) { 
                   1805:            $nocopy=1; 
                   1806:            $nocut=1;
                   1807:         }
1.211     www      1808:         my $copylink='&nbsp;';
1.267     www      1809:         my $cutlink='&nbsp;';
1.280     albertel 1810: 	
1.291     albertel 1811: 	my $skip_confirm = 0;
                   1812: 	if ( $folder =~ /^supplemental/
                   1813: 	     || ($url =~ m{( /smppg$
                   1814: 			    |/syllabus$
                   1815: 			    |/aboutme$
                   1816: 			    |/navmaps$
                   1817: 			    |/bulletinboard$
                   1818: 			    |\.html$
                   1819: 			    |^/adm/wrapper/ext)}x)) {
                   1820: 	    $skip_confirm = 1;
                   1821: 	}
                   1822: 
1.280     albertel 1823: 	if (!$nocopy) {
                   1824: 	    $copylink=(<<ENDCOPY);
1.284     albertel 1825: <a href='javascript:markcopy("$esc_path","$index","$renametitle","$container","$symb","$folder");' class="LC_docs_copy">$lt{'cp'}</a>
1.211     www      1826: ENDCOPY
1.280     albertel 1827:         }
                   1828: 	if (!$nocut) {
                   1829: 	    $cutlink=(<<ENDCUT);
1.291     albertel 1830: <a href='javascript:cutres("$esc_path","$index","$renametitle","$container","$symb","$folder",$skip_confirm);' class="LC_docs_cut">$lt{'ct'}</a>
1.267     www      1831: ENDCUT
1.280     albertel 1832:         }
1.286     albertel 1833: 	$form_start = (<<END);
                   1834:    <form  action="/adm/coursedocs" method="post">
1.280     albertel 1835:    <input type="hidden" name="${type}path" value="$path" />
                   1836:    <input type="hidden" name="${type}symb" value="$symb" />
                   1837:    <input type="hidden" name="setparms" value="$orderidx" />
                   1838:    <input type="hidden" name="changeparms" value="0" />
1.286     albertel 1839: END
                   1840:         $form_end = '</form>';
                   1841: 	$line.=(<<END);
1.280     albertel 1842: <td>
1.285     albertel 1843:    <table class="LC_docs_entry_move">
1.280     albertel 1844:       <tr>
1.285     albertel 1845:          <td>
1.282     albertel 1846:             <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 1847:          </td>
                   1848:       </tr>
                   1849:       <tr>
1.285     albertel 1850:         <td>
1.282     albertel 1851:            <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 1852:         </td>
                   1853:       </tr>
                   1854:     </table>
                   1855: </td>
                   1856: <td>
1.286     albertel 1857:    $form_start
1.280     albertel 1858:    $selectbox
1.286     albertel 1859:    $form_end
1.280     albertel 1860: </td>
1.285     albertel 1861: <td class="LC_docs_entry_commands">
1.291     albertel 1862:    <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
1.267     www      1863: $cutlink
1.284     albertel 1864:    <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>
1.211     www      1865: $copylink
1.280     albertel 1866: </td>
1.142     raeburn  1867: END
1.280     albertel 1868: 
1.8       www      1869:     }
1.16      www      1870: # Figure out what kind of a resource this is
                   1871:     my ($extension)=($url=~/\.(\w+)$/);
                   1872:     my $uploaded=($url=~/^\/*uploaded\//);
1.97      albertel 1873:     my $icon=&Apache::loncommon::icon($url);
1.17      www      1874:     my $isfolder=0;
1.142     raeburn  1875:     my $ispage=0;
1.114     albertel 1876:     my $folderarg;
1.142     raeburn  1877:     my $pagearg;
                   1878:     my $pagefile;
1.16      www      1879:     if ($uploaded) {
1.135     albertel 1880: 	if ($extension eq 'sequence') {
                   1881: 	    $icon=$iconpath.'/folder_closed.gif';
1.264     albertel 1882: 	    $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
1.135     albertel 1883: 	    $url='/adm/coursedocs?';
                   1884: 	    $folderarg=$1;
                   1885: 	    $isfolder=1;
1.142     raeburn  1886:         } elsif ($extension eq 'page') {
                   1887:             $icon=$iconpath.'/page.gif';
1.264     albertel 1888:             $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
1.142     raeburn  1889:             $pagearg=$1;
                   1890:             $url='/adm/coursedocs?';
                   1891:             $ispage=1;
1.135     albertel 1892: 	} else {
                   1893: 	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
                   1894: 	}
1.16      www      1895:     }
1.287     albertel 1896:     
                   1897:     my $orig_url = $url;
                   1898:     my $external = ($url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/});
1.142     raeburn  1899:     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113     albertel 1900: 	my $symb=&Apache::lonnet::symbclean(
1.50      www      1901:           &Apache::lonnet::declutter('uploaded/'.
1.174     albertel 1902:            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1903:            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50      www      1904:            '.sequence').
                   1905:            '___'.$residx.'___'.
1.113     albertel 1906: 	   &Apache::lonnet::declutter($url));
                   1907: 	(undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
                   1908: 	$url=&Apache::lonnet::clutter($url);
1.127     albertel 1909: 	if ($url=~/^\/*uploaded\//) {
                   1910: 	    $url=~/\.(\w+)$/;
                   1911: 	    my $embstyle=&Apache::loncommon::fileembstyle($1);
                   1912: 	    if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
                   1913: 		$url='/adm/wrapper'.$url;
                   1914: 	    } elsif ($embstyle eq 'ssi') {
                   1915: 		#do nothing with these
                   1916: 	    } elsif ($url!~/\.(sequence|page)$/) {
                   1917: 		$url='/adm/coursedocs/showdoc'.$url;
                   1918: 	    }
1.145     albertel 1919: 	} elsif ($url=~m|^/ext/|) { 
                   1920: 	    $url='/adm/wrapper'.$url;
1.287     albertel 1921: 	    $external = 1;
1.127     albertel 1922: 	}
1.241     www      1923:         if (&Apache::lonnet::symbverify($symb,$url)) {
                   1924: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                   1925:         } else {
                   1926:             $url='';
                   1927:         }
1.152     albertel 1928: 	if ($container eq 'page') {
1.174     albertel 1929: 	    my $symb=$env{'form.pagesymb'};
1.152     albertel 1930: 	    	    
                   1931: 	    $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228     www      1932: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152     albertel 1933: 	}
1.50      www      1934:     }
1.296     albertel 1935:     my ($parameterset,$rand_order_text) = ('&nbsp;', '&nbsp;');
1.216     albertel 1936:     if ($isfolder || $extension eq 'sequence') {
1.228     www      1937: 	my $foldername=&escape($foldertitle);
1.174     albertel 1938: 	my $folderpath=$env{'form.folderpath'};
1.114     albertel 1939: 	if ($folderpath) { $folderpath.='&' };
1.242     www      1940: # Append randompick number, hidden, and encrypted with ":" to foldername, 
                   1941: # so it gets transferred between levels
1.245     albertel 1942: 	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242     www      1943:                                               'parameter_randompick'))[0]
1.245     albertel 1944:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1945:                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245     albertel 1946:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.296     albertel 1947:                                               'parameter_encrypturl'))[0]=~/^yes$/i)
                   1948:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
                   1949:                                               'parameter_randomorder'))[0]=~/^yes$/i);
1.228     www      1950: 	$url.='folderpath='.&escape($folderpath).$cpinfo;
1.147     matthew  1951: 	$parameterset='<label>'.&mt('Randomly Pick: ').
1.292     albertel 1952: 	    '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randompick_'.$orderidx.'" value="'.
1.245     albertel 1953: 	    (&LONCAPA::map::getparameter($orderidx,
1.147     matthew  1954:                                               'parameter_randompick'))[0].
1.165     www      1955:                                               '" />'.
1.285     albertel 1956: '<a href="javascript:void(0)">'.&mt('Save').'</a></label>';
1.296     albertel 1957:     	my $ro_set=
                   1958: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
                   1959: 	$rand_order_text ='
1.319     bisitz   1960: <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 1961:     }
1.142     raeburn  1962:     if ($ispage) {
1.228     www      1963:         my $pagename=&escape($pagetitle);
1.142     raeburn  1964:         my $pagepath;
1.174     albertel 1965:         my $folderpath=$env{'form.folderpath'};
1.142     raeburn  1966:         if ($folderpath) { $pagepath = $folderpath.'&' };
                   1967:         $pagepath.=$pagearg.'&'.$pagename;
1.174     albertel 1968: 	my $symb=$env{'form.pagesymb'};
1.152     albertel 1969: 	if (!$symb) {
                   1970: 	    my $path='uploaded/'.
1.174     albertel 1971: 		$env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1972: 		$env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152     albertel 1973: 	    $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
                   1974: 					       $residx,
                   1975: 					       $path.$pagearg.'.page');
                   1976: 	}
1.228     www      1977: 	$url.='pagepath='.&escape($pagepath).
1.282     albertel 1978: 	    '&amp;pagesymb='.&escape($symb).$cpinfo;
1.142     raeburn  1979:     }
1.287     albertel 1980:     if ($external) {
                   1981: 	my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';
                   1982: 	$external = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';
                   1983:     } else {
                   1984: 	undef($external);
                   1985:     }
1.285     albertel 1986:     $line.='
                   1987:   <td class="LC_docs_entry_icon">
1.287     albertel 1988:     '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'
1.285     albertel 1989:   </td>
                   1990:   <td class="LC_docs_entry_title">
1.287     albertel 1991:     '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.&mt('(re-initialize course to access)').'</span>').$external."
1.285     albertel 1992:   </td>";
1.120     www      1993:     if (($allowed) && ($folder!~/^supplemental/)) {
                   1994:  	my %lt=&Apache::lonlocal::texthash(
                   1995:  			      'hd' => 'Hidden',
1.165     www      1996:  			      'ec' => 'URL hidden');
1.122     www      1997: 	my $enctext=
1.245     albertel 1998: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122     www      1999: 	my $hidtext=
1.245     albertel 2000: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120     www      2001: 	$line.=(<<ENDPARMS);
1.285     albertel 2002:   <td class="LC_docs_entry_parameter">
1.286     albertel 2003:     $form_start
1.292     albertel 2004:     <label><input type="checkbox" name="hiddenresource_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
1.286     albertel 2005:     $form_end
1.285     albertel 2006:   </td>
                   2007:   <td class="LC_docs_entry_parameter">
1.286     albertel 2008:     $form_start
1.292     albertel 2009:     <label><input type="checkbox" name="encrypturl_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
1.286     albertel 2010:     $form_end
1.285     albertel 2011:   </td>
1.296     albertel 2012:   <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td>
1.286     albertel 2013:   <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td>
1.120     www      2014: ENDPARMS
1.119     www      2015:     }
1.286     albertel 2016:     $line.="</tr>";
1.8       www      2017:     return $line;
                   2018: }
                   2019: 
1.315     jms      2020: =pod
                   2021: 
                   2022: =item tiehash()
                   2023: 
                   2024: tie the hash
                   2025: 
                   2026: =cut
1.27      www      2027: 
                   2028: sub tiehash {
1.136     albertel 2029:     my ($mode)=@_;
1.27      www      2030:     $hashtied=0;
1.174     albertel 2031:     if ($env{'request.course.fn'}) {
1.136     albertel 2032: 	if ($mode eq 'write') {
1.174     albertel 2033: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 2034: 		    &GDBM_WRCREAT(),0640)) {
                   2035:                 $hashtied=2;
                   2036: 	    }
                   2037: 	} else {
1.174     albertel 2038: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 2039: 		    &GDBM_READER(),0640)) {
1.27      www      2040:                 $hashtied=1;
1.136     albertel 2041: 	    }
                   2042: 	}
1.27      www      2043:     }    
                   2044: }
                   2045: 
                   2046: sub untiehash {
                   2047:     if ($hashtied) { untie %hash; }
                   2048:     $hashtied=0;
1.221     albertel 2049:     return OK;
1.27      www      2050: }
                   2051: 
1.315     jms      2052: 
                   2053: 
1.29      www      2054: 
                   2055: sub checkonthis {
                   2056:     my ($r,$url,$level,$title)=@_;
1.228     www      2057:     $url=&unescape($url);
1.29      www      2058:     $alreadyseen{$url}=1;
                   2059:     $r->rflush();
1.41      www      2060:     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108     albertel 2061:        $r->print("\n<br />");
1.313     bisitz   2062:        if ($level==0) {
                   2063:            $r->print("<br />");
                   2064:        }
1.29      www      2065:        for (my $i=0;$i<=$level*5;$i++) {
                   2066:            $r->print('&nbsp;');
                   2067:        }
                   2068:        $r->print('<a href="'.$url.'" target="cat">'.
                   2069: 		 ($title?$title:$url).'</a> ');
                   2070:        if ($url=~/^\/res\//) {
                   2071: 	  my $result=&Apache::lonnet::repcopy(
                   2072:                               &Apache::lonnet::filelocation('',$url));
1.172     raeburn  2073:           if ($result eq 'ok') {
1.313     bisitz   2074:              $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.29      www      2075:              $r->rflush();
1.34      www      2076:              &Apache::lonnet::countacc($url);
                   2077:              $url=~/\.(\w+)$/;
                   2078:              if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
                   2079: 		 $r->print('<br />');
                   2080:                  $r->rflush();
                   2081:                  for (my $i=0;$i<=$level*5;$i++) {
                   2082:                      $r->print('&nbsp;');
                   2083:                  }
1.313     bisitz   2084:                  $r->print('- '.&mt('Rendering:').' ');
1.170     www      2085: 		 my ($errorcount,$warningcount)=split(/:/,
                   2086: 	       &Apache::lonnet::ssi_body($url,
1.173     albertel 2087: 			       ('grade_target'=>'web',
                   2088: 				'return_only_error_and_warning_counts' => 1)));
1.170     www      2089:                  if (($errorcount) ||
                   2090:                      ($warningcount)) {
                   2091: 		     if ($errorcount) {
1.283     albertel 2092:                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><span class="LC_error">'.
1.313     bisitz   2093:                           &mt('[quant,_1,error]',$errorcount).'</span>');
1.34      www      2094:                      }
1.170     www      2095: 		     if ($warningcount) {
1.283     albertel 2096:                         $r->print('<span class="LC_warning">'.
1.313     bisitz   2097:                           &mt('[quant,_1,warning]',$warningcount).'</span>');
1.34      www      2098:                      }
                   2099:                  } else {
1.283     albertel 2100:                      $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.34      www      2101:                  }
                   2102:                  $r->rflush();
                   2103:              }
1.29      www      2104: 	     my $dependencies=
                   2105:                 &Apache::lonnet::metadata($url,'dependencies');
1.320     raeburn  2106:              foreach my $dep (split(/\,/,$dependencies)) {
                   2107: 		 if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {
                   2108:                     &checkonthis($r,$dep,$level+1);
1.29      www      2109:                  }
                   2110:              }
1.172     raeburn  2111:           } elsif ($result eq 'unavailable') {
1.283     albertel 2112:              $r->print('<span class="LC_error">'.&mt('connection down').'</span>');
1.172     raeburn  2113:           } elsif ($result eq 'not_found') {
1.100     www      2114: 	      unless ($url=~/\$/) {
1.313     bisitz   2115: 		  $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
1.100     www      2116: 	      } else {
1.283     albertel 2117: 		  $r->print('<span class="LC_unknown">'.&mt('unable to verify variable URL').'</span>');
1.100     www      2118: 	      }
1.29      www      2119:           } else {
1.283     albertel 2120:              $r->print('<span class="LC_error">'.&mt('access denied').'</span>');
1.29      www      2121:           }
1.313     bisitz   2122:        }
                   2123:     }
1.29      www      2124: }
                   2125: 
1.1       www      2126: 
1.315     jms      2127: 
                   2128: =pod
                   2129: 
                   2130: =item list_symbs()
                   2131: 
                   2132: List Symbs
                   2133: 
                   2134: =cut
                   2135: 
1.208     albertel 2136: sub list_symbs {
1.224     albertel 2137:     my ($r) = @_;
                   2138: 
                   2139:     $r->print(&Apache::loncommon::start_page('Symb List'));
1.257     www      2140:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
1.224     albertel 2141:     my $navmap = Apache::lonnavmaps::navmap->new();
                   2142:     $r->print("<pre>\n");
                   2143:     foreach my $res ($navmap->retrieveResources()) {
                   2144: 	$r->print($res->compTitle()."\t".$res->symb()."\n");
                   2145:     }
                   2146:     $r->print("\n</pre>\n");
                   2147:     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208     albertel 2148: }
                   2149: 
                   2150: 
1.315     jms      2151: 
1.75      www      2152: sub verifycontent {
1.224     albertel 2153:     my ($r) = @_;
1.230     albertel 2154:     my $type = &Apache::loncommon::course_type();
1.26      www      2155:    my $loaderror=&Apache::lonnet::overloaderror($r);
                   2156:    if ($loaderror) { return $loaderror; }
1.229     raeburn  2157:    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.257     www      2158:    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
1.27      www      2159:    $hashtied=0;
1.30      www      2160:    undef %alreadyseen;
                   2161:    %alreadyseen=();
1.27      www      2162:    &tiehash();
1.320     raeburn  2163:    foreach my $key (keys(%hash)) {
                   2164:        if ($hash{$key}=~/\.(page|sequence)$/) {
                   2165: 	   if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
1.283     albertel 2166: 	       $r->print('<hr /><span class="LC_error">'.
1.230     albertel 2167: 			 &mt('The following sequence or page is included more than once in your '.$type.': ').
1.320     raeburn  2168: 			 &unescape($hash{$key}).'</span><br />'.
1.140     www      2169: 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
                   2170: 	   }
                   2171:        }
1.320     raeburn  2172:        if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
                   2173:            &checkonthis($r,$hash{$key},0,$hash{'title_'.$1});
1.27      www      2174:        }
                   2175:    }
                   2176:    &untiehash();
1.108     albertel 2177:    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
                   2178: 	     &mt('Return to DOCS').'</a>');
1.75      www      2179: }
                   2180: 
                   2181: 
1.192     www      2182: sub devalidateversioncache {
                   2183:     my $src=shift;
                   2184:     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
                   2185: 					  &Apache::lonnet::clutter($src));
                   2186: }
                   2187: 
1.75      www      2188: sub checkversions {
1.224     albertel 2189:     my ($r) = @_;
1.230     albertel 2190:     my $type = &Apache::loncommon::course_type();
1.229     raeburn  2191:     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.257     www      2192:     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
1.89      www      2193:     my $header='';
                   2194:     my $startsel='';
                   2195:     my $monthsel='';
                   2196:     my $weeksel='';
                   2197:     my $daysel='';
                   2198:     my $allsel='';
                   2199:     my %changes=();
                   2200:     my $starttime=0;
1.91      www      2201:     my $haschanged=0;
1.92      www      2202:     my %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2203: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2204: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.92      www      2205: 
                   2206:     $hashtied=0;
                   2207:     &tiehash();
                   2208:     my %newsetversions=();
1.174     albertel 2209:     if ($env{'form.setmostrecent'}) {
1.91      www      2210: 	$haschanged=1;
1.320     raeburn  2211: 	foreach my $key (keys(%hash)) {
                   2212: 	    if ($key=~/^ids\_(\/res\/.+)$/) {
1.93      www      2213: 		$newsetversions{$1}='mostrecent';
1.192     www      2214:                 &devalidateversioncache($1);
1.92      www      2215: 	    }
                   2216: 	}
1.174     albertel 2217:     } elsif ($env{'form.setcurrent'}) {
1.91      www      2218: 	$haschanged=1;
1.320     raeburn  2219: 	foreach my $key (keys(%hash)) {
                   2220: 	    if ($key=~/^ids\_(\/res\/.+)$/) {
1.93      www      2221: 		my $getvers=&Apache::lonnet::getversion($1);
                   2222: 		if ($getvers>0) {
                   2223: 		    $newsetversions{$1}=$getvers;
1.192     www      2224: 		    &devalidateversioncache($1);
1.93      www      2225: 		}
1.92      www      2226: 	    }
                   2227: 	}
1.174     albertel 2228:     } elsif ($env{'form.setversions'}) {
1.91      www      2229: 	$haschanged=1;
1.320     raeburn  2230: 	foreach my $key (keys(%env)) {
                   2231: 	    if ($key=~/^form\.set_version_(.+)$/) {
1.92      www      2232: 		my $src=$1;
1.320     raeburn  2233: 		if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
                   2234: 		    $newsetversions{$src}=$env{$key};
1.192     www      2235: 		    &devalidateversioncache($src);
1.92      www      2236: 		}
                   2237: 	    }
                   2238: 	}
1.91      www      2239:     }
                   2240:     if ($haschanged) {
1.92      www      2241:         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174     albertel 2242: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2243: 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
1.272     albertel 2244: 	    $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
1.92      www      2245: 	} else {
1.283     albertel 2246: 	    $r->print('<h1><span class="LC_error">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</span></h1>');
1.92      www      2247: 	}
1.136     albertel 2248: 	&mark_hash_old();
1.91      www      2249:     }
1.136     albertel 2250:     &changewarning($r,'');
1.174     albertel 2251:     if ($env{'form.timerange'} eq 'all') {
1.89      www      2252: # show all documents
1.230     albertel 2253: 	$header=&mt('All Documents in '.$type);
1.91      www      2254: 	$allsel=1;
1.320     raeburn  2255: 	foreach my $key (keys(%hash)) {
                   2256: 	    if ($key=~/^ids\_(\/res\/.+)$/) {
1.90      www      2257: 		my $src=$1;
                   2258: 		$changes{$src}=1;
                   2259: 	    }
                   2260: 	}
1.89      www      2261:     } else {
                   2262: # show documents which changed
                   2263: 	%changes=&Apache::lonnet::dump
1.174     albertel 2264: 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                   2265:                      $env{'course.'.$env{'request.course.id'}.'.num'});
1.320     raeburn  2266: 	my $firstkey=(keys(%changes))[0];
1.89      www      2267: 	unless ($firstkey=~/^error\:/) {
1.174     albertel 2268: 	    unless ($env{'form.timerange'}) {
                   2269: 		$env{'form.timerange'}=604800;
1.89      www      2270: 	    }
1.174     albertel 2271: 	    my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89      www      2272: 		.&mt('seconds');
1.174     albertel 2273: 	    if ($env{'form.timerange'}==-1) {
1.89      www      2274: 		$seltext='since start of course';
                   2275: 		$startsel='selected';
1.174     albertel 2276: 		$env{'form.timerange'}=time;
1.89      www      2277: 	    }
1.174     albertel 2278: 	    $starttime=time-$env{'form.timerange'};
                   2279: 	    if ($env{'form.timerange'}==2592000) {
1.89      www      2280: 		$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2281: 		$monthsel='selected';
1.174     albertel 2282: 	    } elsif ($env{'form.timerange'}==604800) {
1.89      www      2283: 		$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2284: 		$weeksel='selected';
1.174     albertel 2285: 	    } elsif ($env{'form.timerange'}==86400) {
1.89      www      2286: 		$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2287: 		$daysel='selected';
                   2288: 	    }
                   2289: 	    $header=&mt('Content changed').' '.$seltext;
                   2290: 	} else {
                   2291: 	    $header=&mt('No content modifications yet.');
                   2292: 	}
                   2293:     }
1.92      www      2294:     %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2295: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2296: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      2297:     my %lt=&Apache::lonlocal::texthash
1.229     raeburn  2298: 	      ('st' => 'Version changes since start of '.$type,
1.88      www      2299: 	       'lm' => 'Version changes since last Month',
                   2300: 	       'lw' => 'Version changes since last Week',
                   2301: 	       'sy' => 'Version changes since Yesterday',
1.91      www      2302:                'al' => 'All Resources (possibly large output)',
1.88      www      2303: 	       'sd' => 'Display',
1.84      www      2304: 	       'fi' => 'File',
                   2305: 	       'md' => 'Modification Date',
1.87      www      2306:                'mr' => 'Most recently published Version',
1.229     raeburn  2307: 	       've' => 'Version used in '.$type,
                   2308:                'vu' => 'Set Version to be used in '.$type,
                   2309: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91      www      2310: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
                   2311: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84      www      2312: 	       'di' => 'Differences');
1.89      www      2313:     $r->print(<<ENDHEADERS);
1.31      www      2314: <form action="/adm/coursedocs" method="post">
1.91      www      2315: <input type="hidden" name="versions" value="1" />
                   2316: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
                   2317: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31      www      2318: <select name="timerange">
1.88      www      2319: <option value='all' $allsel>$lt{'al'}</option>
1.84      www      2320: <option value="-1" $startsel>$lt{'st'}</option>
                   2321: <option value="2592000" $monthsel>$lt{'lm'}</option>
                   2322: <option value="604800" $weeksel>$lt{'lw'}</option>
                   2323: <option value="86400" $daysel>$lt{'sy'}</option>
1.31      www      2324: </select>
1.91      www      2325: <input type="submit" name="display" value="$lt{'sd'}" />
1.89      www      2326: <h3>$header</h3>
1.91      www      2327: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103     matthew  2328: <table border="0">
1.31      www      2329: ENDHEADERS
1.320     raeburn  2330:     foreach my $key (sort(keys(%changes))) {
                   2331: 	if ($changes{$key}>$starttime) {
                   2332: 	    my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
                   2333: 	    my $currentversion=&Apache::lonnet::getversion($key);
1.93      www      2334: 	    if ($currentversion<0) {
                   2335: 		$currentversion=&mt('Could not be determined.');
                   2336: 	    }
1.320     raeburn  2337: 	    my $linkurl=&Apache::lonnet::clutter($key);
1.89      www      2338: 	    $r->print(
1.103     matthew  2339: 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91      www      2340: 		      &Apache::lonnet::gettitle($linkurl).
1.103     matthew  2341:                       '</b></font></td></tr>'.
                   2342:                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                   2343:                       '<td colspan="4">'.
                   2344:                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.
                   2345: 		      '</a></td></tr>'.
                   2346:                       '<tr><td></td>'.
                   2347:                       '<td title="'.$lt{'md'}.'">'.
1.102     matthew  2348: 		      &Apache::lonlocal::locallocaltime(
                   2349:                            &Apache::lonnet::metadata($root.'.'.$extension,
                   2350:                                                      'lastrevisiondate')
                   2351:                                                         ).
1.103     matthew  2352:                       '</td>'.
1.284     albertel 2353:                       '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.
1.103     matthew  2354:                       '<font size="+1">'.$currentversion.'</font>'.
1.284     albertel 2355:                       '</span></td>'.
                   2356:                       '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$type.': '.
1.103     matthew  2357:                       '<font size="+1">');
1.87      www      2358: # Used in course
1.89      www      2359: 	    my $usedversion=$hash{'version_'.$linkurl};
1.93      www      2360: 	    if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89      www      2361: 		$r->print($usedversion);
                   2362: 	    } else {
                   2363: 		$r->print($currentversion);
                   2364: 	    }
1.284     albertel 2365: 	    $r->print('</font></span></td><td title="'.$lt{'vu'}.'">'.
                   2366:                       '<span class="LC_nobreak">Use: ');
1.87      www      2367: # Set version
1.92      www      2368: 	    $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89      www      2369: 						      'set_version_'.$linkurl,
1.136     albertel 2370: 						      ('select_form_order' =>
                   2371: 						       ['',1..$currentversion,'mostrecent'],
                   2372: 						       '' => '',
1.93      www      2373: 						       'mostrecent' => 'most recent',
1.89      www      2374: 						       map {$_,$_} (1..$currentversion))));
1.284     albertel 2375: 	    $r->print('</span></td></tr><tr><td></td>');
1.89      www      2376: 	    my $lastold=1;
                   2377: 	    for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                   2378: 		my $url=$root.'.'.$prevvers.'.'.$extension;
                   2379: 		if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
                   2380: 		    $starttime) {
                   2381: 		    $lastold=$prevvers;
                   2382: 		}
                   2383: 	    }
1.103     matthew  2384:             # 
                   2385:             # Code to figure out how many version entries should go in
                   2386:             # each of the four columns
                   2387:             my $entries_per_col = 0;
                   2388:             my $num_entries = ($currentversion-$lastold);
                   2389:             if ($num_entries % 4 == 0) {
                   2390:                 $entries_per_col = $num_entries/4;
                   2391:             } else {
                   2392:                 $entries_per_col = $num_entries/4 + 1;
                   2393:             }
                   2394:             my $entries_count = 0;
                   2395:             $r->print('<td valign="top"><font size="-2">'); 
                   2396:             my $cols_output = 1;
1.32      www      2397:             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89      www      2398: 		my $url=$root.'.'.$prevvers.'.'.$extension;
1.284     albertel 2399: 		$r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url).
1.91      www      2400: 			  '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103     matthew  2401: 			  &Apache::lonlocal::locallocaltime(
                   2402:                                 &Apache::lonnet::metadata($url,
                   2403:                                                           'lastrevisiondate')
                   2404:                                                             ).
1.91      www      2405: 			  ')');
1.89      www      2406: 		if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33      www      2407:                     $r->print(' <a href="/adm/diff?filename='.
1.89      www      2408: 			      &Apache::lonnet::clutter($root.'.'.$extension).
                   2409: 			      '&versionone='.$prevvers.
                   2410: 			      '">'.&mt('Diffs').'</a>');
                   2411: 		}
1.284     albertel 2412: 		$r->print('</span><br />');
1.103     matthew  2413:                 if (++$entries_count % $entries_per_col == 0) {
                   2414:                     $r->print('</font></td>');
                   2415:                     if ($cols_output != 4) {
                   2416:                         $r->print('<td valign="top"><font size="-2">');
                   2417:                         $cols_output++;
                   2418:                     }
                   2419:                 }
1.89      www      2420: 	    }
1.103     matthew  2421:             while($cols_output++ < 4) {
                   2422:                 $r->print('</font></td><td><font>')
                   2423:             }
                   2424: 	    $r->print('</font></td></tr>'."\n");
1.89      www      2425: 	}
                   2426:     }
1.92      www      2427:     $r->print('</table></form>');
1.89      www      2428:     $r->print('<h1>'.&mt('Done').'.</h1>');
                   2429: 
                   2430:     &untiehash();
1.75      www      2431: }
                   2432: 
1.136     albertel 2433: sub mark_hash_old {
                   2434:     my $retie_hash=0;
                   2435:     if ($hashtied) {
                   2436: 	$retie_hash=1;
                   2437: 	&untiehash();
                   2438:     }
                   2439:     &tiehash('write');
                   2440:     $hash{'old'}=1;
                   2441:     &untiehash();
                   2442:     if ($retie_hash) { &tiehash(); }
                   2443: }
                   2444: 
                   2445: sub is_hash_old {
                   2446:     my $untie_hash=0;
                   2447:     if (!$hashtied) {
                   2448: 	$untie_hash=1;
                   2449: 	&tiehash();
                   2450:     }
                   2451:     my $return=$hash{'old'};
                   2452:     if ($untie_hash) { &untiehash(); }
                   2453:     return $return;
                   2454: }
                   2455: 
1.91      www      2456: sub changewarning {
1.177     albertel 2457:     my ($r,$postexec,$message,$url)=@_;
1.136     albertel 2458:     if (!&is_hash_old()) { return; }
1.150     albertel 2459:     my $pathvar='folderpath';
1.228     www      2460:     my $path=&escape($env{'form.folderpath'});
1.177     albertel 2461:     if (!defined($url)) {
                   2462: 	if (defined($env{'form.pagepath'})) {
                   2463: 	    $pathvar='pagepath';
1.228     www      2464: 	    $path=&escape($env{'form.pagepath'});
                   2465: 	    $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
1.177     albertel 2466: 	}
                   2467: 	$url='/adm/coursedocs?'.$pathvar.'='.$path;
                   2468:     }
1.230     albertel 2469:     my $course_type = &Apache::loncommon::course_type();
1.177     albertel 2470:     if (!defined($message)) {
                   2471: 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150     albertel 2472:     }
1.185     www      2473:     $r->print("\n\n".
1.286     albertel 2474: '<script type="text/javascript">function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
1.185     www      2475: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177     albertel 2476: '<input type="hidden" name="orgurl" value="'.$url.
1.283     albertel 2477: '" /><input type="hidden" name="selectrole" value="1" /><h3><span class="LC_warning">'.
1.177     albertel 2478: &mt($message,' <input type="hidden" name="'.
                   2479:     $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230     albertel 2480:     &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.283     albertel 2481: $help{'Caching'}.'</span></h3></form>'."\n\n");
1.91      www      2482: }
                   2483: 
1.257     www      2484: 
                   2485: sub init_breadcrumbs {
                   2486:     my ($form,$text)=@_;
                   2487:     &Apache::lonhtmlcommon::clear_breadcrumbs();
                   2488:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
1.297     albertel 2489: 					    text=>"Edit ".&Apache::loncommon::course_type(),
1.257     www      2490: 					    faq=>273,
                   2491: 					    bug=>'Instructor Interface',
                   2492:                                             help => 'Docs_Adding_Course_Doc'});
                   2493:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
                   2494: 					    text=>$text,
                   2495: 					    faq=>273,
                   2496: 					    bug=>'Instructor Interface'});
                   2497: }
                   2498: 
1.315     jms      2499: 
                   2500: 
                   2501: 
1.75      www      2502: sub handler {
                   2503:     my $r = shift;
1.82      www      2504:     &Apache::loncommon::content_type($r,'text/html');
1.75      www      2505:     $r->send_http_header;
                   2506:     return OK if $r->header_only;
1.230     albertel 2507:     my $type = &Apache::loncommon::course_type();
1.75      www      2508: 
                   2509: # --------------------------------------------- Initialize help topics for this
1.320     raeburn  2510:     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
                   2511: 	               'Adding_External_Resource','Navigate_Content',
                   2512: 	               'Adding_Folders','Docs_Overview', 'Load_Map',
                   2513: 	               'Supplemental','Score_Upload_Form','Adding_Pages',
                   2514: 	               'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                   2515: 	               'Check_Resource_Versions','Verify_Content') {
                   2516: 	$help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
1.209     albertel 2517:     }
1.75      www      2518:     # Composite help files
                   2519:     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
                   2520: 		    'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
                   2521:     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
                   2522: 		    'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86      albertel 2523:     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
                   2524: 		    'Option_Response_Simple');
1.75      www      2525:     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
                   2526: 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
                   2527:     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
                   2528: 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
1.255     raeburn  2529:     $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
1.75      www      2530:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2531: 
1.209     albertel 2532: # does this user have privileges to modify docs
                   2533:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2534:   if ($allowed && $env{'form.verify'}) {
1.257     www      2535:       &init_breadcrumbs('verify','Verify Content');
1.75      www      2536:       &verifycontent($r);
1.209     albertel 2537:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.257     www      2538:       &init_breadcrumbs('listsymbs','List Symbs');
1.208     albertel 2539:       &list_symbs($r);
1.247     www      2540:   } elsif ($allowed && $env{'form.docslog'}) {
1.257     www      2541:       &init_breadcrumbs('docslog','Show Log');
1.247     www      2542:       &docs_change_log($r);
1.209     albertel 2543:   } elsif ($allowed && $env{'form.versions'}) {
1.257     www      2544:       &init_breadcrumbs('versions','Check/Set Resource Versions');
1.75      www      2545:       &checkversions($r);
1.209     albertel 2546:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.257     www      2547:       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
1.75      www      2548:       &dumpcourse($r);
1.209     albertel 2549:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.257     www      2550:       &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
1.138     raeburn  2551:       &exportcourse($r);
1.26      www      2552:   } else {
1.7       www      2553: # is this a standard course?
                   2554: 
1.174     albertel 2555:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2556:     my $forcestandard = 0;
1.15      www      2557:     my $forcesupplement;
                   2558:     my $script='';
1.19      www      2559:     my $showdoc=0;
1.142     raeburn  2560:     my $containertag;
                   2561:     my $uploadtag;
1.15      www      2562:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2563: 					    ['folderpath','pagepath',
1.281     albertel 2564: 					     'pagesymb']);
1.307     www      2565: # No folderpath, no pagepath, see if we have something stored
                   2566:     if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
                   2567:         &Apache::loncommon::restore_course_settings('docs_folderpath',
                   2568:                                               {'folderpath' => 'scalar'});
                   2569:     }
                   2570:     if (!$env{'form.folderpath'}) {
                   2571:         &Apache::loncommon::restore_course_settings('docs_folderpath',
                   2572:                                               {'pagepath' => 'scalar'});
                   2573:     }
                   2574:     if ($env{'form.pagepath'}) {
                   2575:        $env{'form.folderpath'}='';
                   2576:     }
1.309     raeburn  2577:     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
                   2578:         $env{'form.folderpath'} = 'supplemental&'.
                   2579:                                   &escape(&mt('Supplemental '.$type.' Documents')).'&'.
                   2580:                                   $env{'form.folderpath'};
                   2581:     }
1.307     www      2582:     &Apache::loncommon::store_course_settings('docs_folderpath',
                   2583:                                                 {'pagepath' => 'scalar',
                   2584:                                                  'folderpath' => 'scalar'});
1.174     albertel 2585:     if ($env{'form.folderpath'}) {
                   2586: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2587: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2588: 	$env{'form.folder'}=pop(@folderpath);
                   2589:     }
                   2590:     if ($env{'form.pagepath'}) {
                   2591:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2592:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2593:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2594:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2595: 	    '<input type="hidden" name="pagesymb" value="" />';
1.282     albertel 2596:         $uploadtag = '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
                   2597: 	    '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />';
1.142     raeburn  2598:     }
1.21      www      2599:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2600:        $showdoc='/'.$1;
1.21      www      2601:     }
                   2602:     unless ($showdoc) { # got called from remote
1.237     albertel 2603:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2604:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2605:            $forcestandard = 1;
                   2606:        } 
1.174     albertel 2607:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2608: 
1.15      www      2609:        if ($allowed) { 
                   2610:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2611:          $script=&Apache::lonratedt::editscript('simple'); 
                   2612:        }
                   2613:     } else { # got called in sequence from course
                   2614:        $allowed=0;
1.3       www      2615:     }
1.4       www      2616: 
                   2617: # get course data
1.174     albertel 2618:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2619:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2620: 
1.225     albertel 2621: # get personal data 
1.174     albertel 2622:     my $uname=$env{'user.name'};
                   2623:     my $udom=$env{'user.domain'};
1.245     albertel 2624:     my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14      www      2625: 
1.8       www      2626: # graphics settings
1.4       www      2627: 
1.176     albertel 2628:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2629: 
1.224     albertel 2630:     if ($allowed) {
                   2631: 	$script .= &editing_js($udom,$uname);
1.171     www      2632:     }
1.42      www      2633: # -------------------------------------------------------------------- Body tag
1.224     albertel 2634:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.324   ! raeburn  2635:     my $brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}];
1.229     raeburn  2636:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.324   ! raeburn  2637: 				    {'force_register' => $showdoc,
        !          2638:                                      'bread_crumbs' => $brcrum}).
1.233     albertel 2639: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2640:   
1.188     raeburn  2641:   my %allfiles = ();
                   2642:   my %codebase = ();
                   2643:   my ($upload_result,$upload_output);
                   2644:   if ($allowed) {
1.264     albertel 2645:       if (($env{'form.uploaddoc.filename'}) &&
                   2646: 	  ($env{'form.cmd'}=~/^upload_(\w+)/)) {
1.188     raeburn  2647: # Process file upload - phase one - upload and parse primary file.  
1.298     albertel 2648: 	  undef($hadchanges);
1.190     albertel 2649:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2650: 						$coursedom,\%allfiles,
1.194     raeburn  2651: 						\%codebase,$1);
1.298     albertel 2652: 	  if ($hadchanges) {
                   2653: 	      &mark_hash_old();
                   2654: 	  }
1.188     raeburn  2655:           if ($upload_result eq 'phasetwo') {
                   2656:               $r->print($upload_output);
                   2657:           }
                   2658:       } elsif ($env{'form.phasetwo'}) {
                   2659:           my %newname = ();
                   2660:           my %origname = ();
                   2661:           my %attribs = ();
                   2662:           my $updateflag = 0;
                   2663:           my $residx = $env{'form.newidx'};
1.228     www      2664:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2665: # Process file upload - phase two - gather secondary files.
                   2666:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2667:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2668:                   my $javacodebase;
                   2669:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2670:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2671:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2672:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2673:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2674:                   }
                   2675:                   my @attributes = ();
                   2676:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
1.320     raeburn  2677:                       @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});
1.188     raeburn  2678:                   } else {
                   2679:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2680:                   }
1.320     raeburn  2681:                   foreach my $attr (@attributes) {
                   2682:                       push(@{$attribs{$i}},&unescape($attr));
1.188     raeburn  2683:                   }
                   2684:                   if ($javacodebase) {
                   2685:                       $codebase{$i} = $javacodebase;
                   2686:                       $codebase{$i} =~ s#/$##;
                   2687:                       $updateflag = 1;
                   2688:                   }
                   2689:               }
                   2690:               unless ($newname{$i} eq $origname{$i}) {
                   2691:                   $updateflag = 1;
                   2692:               }
                   2693:           }
                   2694: # Process file upload - phase three - modify primary file
                   2695:           if ($updateflag) {
                   2696:               my ($content,$rtncode);
                   2697:               my $updateflag = 0;
                   2698:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2699:               if ($getstatus eq 'ok') {
1.320     raeburn  2700:                   foreach my $item (keys(%newname)) {
1.188     raeburn  2701:                       if ($newname{$item} ne $origname{$item}) {
                   2702:                           my $attrib_regexp = '';
                   2703:                           if (@{$attribs{$item}} > 1) {
                   2704:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2705:                           } else {
                   2706:                               $attrib_regexp = $attribs{$item}[0];
                   2707:                           }
                   2708:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2709:                           } 
                   2710:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2711:                       }
                   2712:                       if (exists($codebase{$item})) {
1.224     albertel 2713:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2714:                       }
                   2715:                   }
                   2716: # Save edited file.
                   2717:                   my $saveresult;
                   2718:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2719:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2720:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2721:               } else {
                   2722:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2723:               }
                   2724:           }
                   2725:       }
                   2726:   }
                   2727: 
                   2728:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2729: # -----------------------------------------------------------------------------
                   2730:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2731:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2732:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2733:                 'impp' => 'Import a document',
                   2734:                 'pubd' => 'Published documents',
1.181     www      2735: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2736:                 'spec' => 'Special documents',
                   2737:                 'upld' => 'Upload Document',
                   2738:                 'srch' => 'Search',
                   2739:                 'impo' => 'Import',
1.232     www      2740: 		'book' => 'Import Bookmarks',
1.81      www      2741:                 'selm' => 'Select Map',
                   2742:                 'load' => 'Load Map',
1.186     www      2743:                 'reco' => 'Recover Deleted Resources',
1.81      www      2744:                 'newf' => 'New Folder',
1.142     raeburn  2745:                 'newp' => 'New Composite Page',
1.81      www      2746:                 'extr' => 'External Resource',
                   2747:                 'syll' => 'Syllabus',
                   2748:                 'navc' => 'Navigate Contents',
                   2749:                 'sipa' => 'Simple Page',
                   2750:                 'sipr' => 'Simple Problem',
1.219     www      2751:                 'drbx' => 'Drop Box',
1.81      www      2752:                 'scuf' => 'Score Upload Form',
                   2753:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2754:                 'mypi' => 'My Personal Info',
1.255     raeburn  2755:                 'grpo' => 'Group Files',
1.294     raeburn  2756:                 'rost' => 'Course Roster',
1.101     www      2757: 		'abou' => 'About User',
1.110     raeburn  2758:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2759:                 'file' =>  'File',
                   2760:                 'title' => 'Title',
1.188     raeburn  2761:                 'comment' => 'Comment',
                   2762:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2763: 					  );
                   2764: # -----------------------------------------------------------------------------
1.42      www      2765:     if ($allowed) {
1.281     albertel 2766: 	&update_paste_buffer($coursenum,$coursedom);
1.74      www      2767:        my $dumpbut=&dumpbutton();
1.138     raeburn  2768:        my $exportbut=&exportbutton();
1.88      www      2769:        my %lt=&Apache::lonlocal::texthash(
                   2770: 					 'vc' => 'Verify Content',
                   2771: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2772: 					 'ls' => 'List Symbs',
1.247     www      2773:                                          'sl' => 'Show Log'
1.88      www      2774: 					  );
1.118     albertel 2775: 
1.174     albertel 2776:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2777:        if (!$folderpath) {
1.174     albertel 2778: 	   if ($env{'form.folder'} eq '' ||
                   2779: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2780: 	       $folderpath='default&'.
1.230     albertel 2781: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2782: 	   }
                   2783:        }
1.174     albertel 2784:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2785:            $containertag = '<input type="hidden" name="folderpath" value="" />';
1.282     albertel 2786:            $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
1.142     raeburn  2787:        }
                   2788: 
1.42      www      2789:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2790: <form name="renameform" method="post" action="/adm/coursedocs">
1.283     albertel 2791:   <input type="hidden" name="title" />
                   2792:   <input type="hidden" name="cmd" />
                   2793:   <input type="hidden" name="markcopy" />
                   2794:   <input type="hidden" name="copyfolder" />
                   2795:   $containertag
1.36      www      2796: </form>
1.39      www      2797: <form name="simpleedit" method="post" action="/adm/coursedocs">
1.283     albertel 2798:   <input type="hidden" name="importdetail" value="" />
                   2799:   $uploadtag
1.39      www      2800: </form>
1.26      www      2801: <form action="/adm/coursedocs" method="post" name="courseverify">
1.283     albertel 2802:   <div class="LC_docs_course_commands">
                   2803: 
                   2804:       <div>
                   2805:         <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
                   2806:       </div>
                   2807:       <div>
                   2808:         <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
                   2809:       </div>
                   2810:         $dumpbut
                   2811:         $exportbut
                   2812:       <div>
                   2813:         <input type="submit" name="listsymbs" value="$lt{'ls'}" />
                   2814:       </div>
                   2815:       <div>
                   2816:         <input type="hidden" name="folder" value="$env{'form.folder'}" />
                   2817:         <input type="submit" name="docslog" value="$lt{'sl'}" />
                   2818:       </div>
                   2819:   </div>
1.25      www      2820: </form>
1.283     albertel 2821: <div style="clear: both; height: 0px;">&nbsp;</div>
1.25      www      2822: ENDCOURSEVERIFY
1.74      www      2823:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2824: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2825:     }
1.17      www      2826: # --------------------------------------------------------- Standard documents
1.293     albertel 2827:     $r->print('<table class="LC_docs_documents">');
                   2828: 
1.7       www      2829:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.285     albertel 2830: 	$r->print('<tr><td class="LC_docs_document">');
1.116     albertel 2831: #  '<h2>'.&mt('Main Course Documents').
                   2832: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2833:        my $folder=$env{'form.folder'};
1.117     albertel 2834:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2835:            $folder='default';
1.230     albertel 2836: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.293     albertel 2837:            $uploadtag = '<input type="hidden" name="folderpath" value="'.
                   2838: 	       &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
1.112     raeburn  2839:        }
1.51      www      2840:        my $postexec='';
                   2841:        if ($folder eq 'default') {
1.286     albertel 2842: 	   $r->print('<script type="text/javascript">this.window.name="loncapaclient";</script>');
1.51      www      2843:        } else {
1.117     albertel 2844:            #$postexec='self.close();';
1.51      www      2845:        }
1.40      www      2846:        $hadchanges=0;
1.292     albertel 2847:        my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,
1.309     raeburn  2848: 			   $upload_output,$type);
1.292     albertel 2849:        if ($error) {
                   2850: 	   $r->print('<p><span class="LC_error">'.$error.'</span></p>');
                   2851:        }
1.40      www      2852:        if ($hadchanges) {
1.320     raeburn  2853: 	   &mark_hash_old();
1.40      www      2854:        }
1.136     albertel 2855:        &changewarning($r,$postexec);
1.16      www      2856:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2857:                      '.sequence';
1.142     raeburn  2858:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2859:                      '.page';
1.186     www      2860: 	my $container='sequence';
                   2861: 	if ($env{'form.pagepath'}) {
                   2862: 	    $container='page';
                   2863: 	}
                   2864: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2865:        $r->print(<<ENDFORM);
1.285     albertel 2866: <table class="LC_docs_adddocs">
                   2867: <tr>
                   2868: <th>$lt{'uplm'}</th>
                   2869: <th>$lt{'impp'}</th>
                   2870: <th>$lt{'spec'}</th>
1.11      www      2871: </tr>
1.285     albertel 2872: <tr>
                   2873: <td>
1.96      sakharuk 2874: $lt{'file'}:<br />
1.182     albertel 2875: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286     albertel 2876: <input type="file" name="uploaddoc" size="40" />
1.8       www      2877: <br />
1.96      sakharuk 2878: $lt{'title'}:<br />
1.286     albertel 2879: <input type="text" size="50" name="comment" />
1.142     raeburn  2880: $uploadtag
1.286     albertel 2881: <input type="hidden" name="cmd" value="upload_default" />
1.188     raeburn  2882: <br />
1.284     albertel 2883: <span class="LC_nobreak">
1.190     albertel 2884: <label>$lt{'parse'}?
1.306     www      2885: <input type="checkbox" name="parserflag" checked="checked" />
1.190     albertel 2886: </label>
1.284     albertel 2887: </span>
1.188     raeburn  2888: <br />
                   2889: <br />
1.284     albertel 2890: <span class="LC_nobreak">
1.286     albertel 2891: <input type="submit" value="$lt{'upld'}" />
1.60      albertel 2892:  $help{'Uploading_From_Harddrive'}
1.284     albertel 2893: </span>
1.60      albertel 2894: </form>
1.11      www      2895: </td>
1.285     albertel 2896: <td>
1.39      www      2897: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2898: $lt{'pubd'}<br />
1.142     raeburn  2899: $uploadtag
1.286     albertel 2900: <input type="button" onClick="javascript:groupsearch()" value="$lt{'srch'}" />
1.232     www      2901: <br />
1.284     albertel 2902: <span class="LC_nobreak">
1.286     albertel 2903: <input type="button" onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2904: $help{'Importing_LON-CAPA_Resource'}
1.284     albertel 2905: </span>
1.232     www      2906: <br />
1.286     albertel 2907: <input type="button" onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
                   2908: <hr />
1.59      www      2909: <p>
1.181     www      2910: $lt{'copm'}<br />
1.282     albertel 2911: <input type="text" size="40" name="importmap" /><br />
1.286     albertel 2912: <span class="LC_nobreak"><input type="button" 
1.52      www      2913: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.282     albertel 2914: value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
1.284     albertel 2915: $help{'Load_Map'}</span>
1.59      www      2916: </p>
1.52      www      2917: </form>
1.186     www      2918: <hr />
                   2919: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2920: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2921: </form>
1.142     raeburn  2922: ENDFORM
1.174     albertel 2923:        unless ($env{'form.pagepath'}) {
1.168     www      2924: 	   $r->print(<<ENDFORM);
                   2925: <hr />
                   2926: <form action="/adm/coursedocs" method="post" name="newext">
                   2927: $uploadtag
1.256     albertel 2928: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2929: <span class="LC_nobreak">
1.168     www      2930: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2931: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284     albertel 2932: </span>
1.168     www      2933: </form>
1.214     www      2934: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2935: <input type="hidden" name="folder" value="$folder" />
                   2936: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2937: </form>
                   2938: ENDFORM
                   2939:        }
1.285     albertel 2940:        $r->print('</td><td>');
1.174     albertel 2941:        unless ($env{'form.pagepath'}) {
1.282     albertel 2942: 	   my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.142     raeburn  2943:            $r->print(<<ENDFORM);
1.214     www      2944: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.282     albertel 2945: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 2946: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2947: <span class="LC_nobreak">
1.16      www      2948: <input name="newfolder" type="button"
                   2949: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2950: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.284     albertel 2951: </span>
1.11      www      2952: </form>
1.214     www      2953: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.282     albertel 2954: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 2955: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2956: <span class="LC_nobreak">
1.142     raeburn  2957: <input name="newpage" type="button"
                   2958: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2959: value="$lt{'newp'}" />$help{'Adding_Pages'}
1.284     albertel 2960: </span>
1.142     raeburn  2961: </form>
1.214     www      2962: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2963: $uploadtag
1.256     albertel 2964: <input type="hidden" name="importdetail" 
1.305     bisitz   2965: value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
1.284     albertel 2966: <span class="LC_nobreak">
1.81      www      2967: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2968:  $help{'Syllabus'}
1.284     albertel 2969: </span>
1.58      albertel 2970: </form>
1.214     www      2971: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2972: $uploadtag
1.256     albertel 2973: <input type="hidden" name="importdetail" 
1.305     bisitz   2974: value="$lt{'navc'}=/adm/navmaps" />
1.284     albertel 2975: <span class="LC_nobreak">
1.81      www      2976: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2977: $help{'Navigate_Content'}
1.284     albertel 2978: </span>
1.22      www      2979: </form>
1.214     www      2980: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2981: $uploadtag
1.256     albertel 2982: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2983: <span class="LC_nobreak">
1.81      www      2984: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2985: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.284     albertel 2986: </span>
1.55      www      2987: </form>
1.214     www      2988: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2989: $uploadtag
1.256     albertel 2990: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2991: <span class="LC_nobreak">
1.81      www      2992: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2993: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284     albertel 2994: </span>
1.62      www      2995: </form>
1.219     www      2996: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2997: $uploadtag      
1.256     albertel 2998: <input type="hidden" name="importdetail" value="" />
1.284     albertel 2999: <span class="LC_nobreak">          
1.219     www      3000: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   3001: onClick="javascript:makedropbox();" />
1.284     albertel 3002: </span>         
1.219     www      3003: </form> 
1.214     www      3004: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  3005: $uploadtag
1.256     albertel 3006: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3007: <span class="LC_nobreak">
1.81      www      3008: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      3009: onClick="javascript:makeexamupload();" />
1.66      bowersj2 3010: $help{'Score_Upload_Form'}
1.284     albertel 3011: </span>
1.22      www      3012: </form>
1.214     www      3013: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  3014: $uploadtag
1.256     albertel 3015: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3016: <span class="LC_nobreak">
1.81      www      3017: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      3018: onClick="javascript:makebulboard();" />
1.65      bowersj2 3019: $help{'Bulletin Board'}
1.284     albertel 3020: </span>
1.58      albertel 3021: </form>
1.214     www      3022: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  3023: $uploadtag
1.256     albertel 3024: <input type="hidden" name="importdetail" 
                   3025: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284     albertel 3026: <span class="LC_nobreak">
1.81      www      3027: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 3028: $help{'My Personal Info'}
1.284     albertel 3029: </span>
1.101     www      3030: </form>
1.214     www      3031: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  3032: $uploadtag
1.256     albertel 3033: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3034: <span class="LC_nobreak">
1.101     www      3035: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   3036: onClick="javascript:makeabout();" />
1.284     albertel 3037: </span>
1.182     albertel 3038: </form>
1.255     raeburn  3039: <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
                   3040: $uploadtag
1.256     albertel 3041: <input type="hidden" name="importdetail"
1.305     bisitz   3042: value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
1.284     albertel 3043: <span class="LC_nobreak">
1.255     raeburn  3044: <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
                   3045: $help{'Group Files'}
1.284     albertel 3046: </span>
1.255     raeburn  3047: </form>
1.294     raeburn  3048: <br /><form action="/adm/coursedocs" method="post" name="newroster">
                   3049: $uploadtag
                   3050: <input type="hidden" name="importdetail" 
1.305     bisitz   3051: value="$lt{'rost'}=/adm/viewclasslist" />
1.294     raeburn  3052: <span class="LC_nobreak">
                   3053: <input name="newroster" type="submit" value="$lt{'rost'}" />
                   3054: $help{'Course Roster'}
                   3055: </span>
                   3056: </form>
1.142     raeburn  3057: ENDFORM
                   3058:        }
1.174     albertel 3059:        if ($env{'form.pagepath'}) {
1.142     raeburn  3060:            $r->print(<<ENDBLOCK);
                   3061: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   3062: $uploadtag
1.256     albertel 3063: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3064: <span class="LC_nobreak">
1.142     raeburn  3065: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   3066: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284     albertel 3067: </span>
1.142     raeburn  3068: </form>
1.214     www      3069: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  3070: $uploadtag
1.256     albertel 3071: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3072: <span class="LC_nobreak">
1.142     raeburn  3073: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   3074: onClick="javascript:makeexamupload();" />
                   3075: $help{'Score_Upload_Form'}
1.284     albertel 3076: </span>
1.182     albertel 3077: </form>
1.142     raeburn  3078: ENDBLOCK
                   3079:        }
                   3080:        $r->print('</td></tr>'."\n".
                   3081: '</table>');
1.24      www      3082:        $r->print('</td></tr>');
1.7       www      3083:     }
                   3084: # ----------------------------------------------------- Supplemental documents
                   3085:     if (!$forcestandard) {
1.285     albertel 3086:        $r->print('<tr><td class="LC_docs_document">');
1.116     albertel 3087: # '<h2>'.&mt('Supplemental Course Documents').
                   3088: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 3089:        my $folder=$env{'form.folder'};
1.117     albertel 3090:        unless ($folder=~/^supplemental/) {
1.116     albertel 3091: 	   $folder='supplemental';
1.117     albertel 3092:        }
                   3093:        if ($folder =~ /^supplemental$/ &&
1.309     raeburn  3094: 	   (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
                   3095:           $env{'form.folderpath'} = 'supplemental&'.
                   3096:                                     &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 3097:        }
1.309     raeburn  3098:        my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);
1.292     albertel 3099:        if ($error) {
                   3100: 	   $r->print('<p><span class="LC_error">'.$error.'</span></p>');
                   3101:        }
1.8       www      3102:        if ($allowed) {
1.282     albertel 3103: 	   my $folderseq=
                   3104: 	       '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   3105: 	       '.sequence';
1.17      www      3106: 
1.282     albertel 3107: 	   my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
                   3108: 	   $r->print(<<ENDSUPFORM);
1.285     albertel 3109: <table class="LC_docs_adddocs"><tr>
                   3110: <th>$lt{'upls'}</th>
                   3111: <th>$lt{'spec'}</th>
1.17      www      3112: </tr>
1.285     albertel 3113: <tr><td>
1.10      www      3114: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286     albertel 3115: <input type="file" name="uploaddoc" size="40" />
1.196     raeburn  3116: <br />
                   3117: <br />
1.284     albertel 3118: <span class="LC_nobreak">
1.196     raeburn  3119: <label>$lt{'parse'}?
                   3120: <input type="checkbox" name="parserflag" />
                   3121: </label>
1.284     albertel 3122: </span>
1.196     raeburn  3123: <br /><br />
                   3124: $lt{'comment'}:<br />
1.4       www      3125: <textarea cols=50 rows=4 name='comment'>
                   3126: </textarea>
1.115     albertel 3127: <br />
1.282     albertel 3128: <input type="hidden" name="folderpath" value="$path" />
1.286     albertel 3129: <input type="hidden" name="cmd" value="upload_supplemental" />
1.284     albertel 3130: <span class="LC_nobreak">
1.286     albertel 3131: <input type="submit" value="$lt{'upld'}" />
1.58      albertel 3132:  $help{'Uploading_From_Harddrive'}
1.284     albertel 3133: </span>
1.58      albertel 3134: </form>
1.17      www      3135: </td>
1.285     albertel 3136: <td>
1.18      www      3137: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.282     albertel 3138: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 3139: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3140: <span class="LC_nobreak">
1.17      www      3141: <input name="newfolder" type="button"
                   3142: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      3143: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.284     albertel 3144: </span>
1.17      www      3145: </form>
1.214     www      3146: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.282     albertel 3147: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 3148: <input type="hidden" name="importdetail" value="" />
1.284     albertel 3149: <span class="LC_nobreak">
1.18      www      3150: <input name="newext" type="button" 
                   3151: onClick="javascript:makenewext('supnewext');"
1.81      www      3152: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284     albertel 3153: </span>
1.17      www      3154: </form>
1.214     www      3155: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.282     albertel 3156: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 3157: <input type="hidden" name="importdetail" 
                   3158: value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
1.284     albertel 3159: <span class="LC_nobreak">
1.81      www      3160: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 3161: $help{'Syllabus'}
1.284     albertel 3162: </span>
1.58      albertel 3163: </form>
1.214     www      3164: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.282     albertel 3165: <input type="hidden" name="folderpath" value="$path" />
1.256     albertel 3166: <input type="hidden" name="importdetail" 
                   3167: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284     albertel 3168: <span class="LC_nobreak">
1.81      www      3169: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 3170: $help{'My Personal Info'}
1.284     albertel 3171: </span>
1.58      albertel 3172: </form>
1.17      www      3173: </td></tr>
1.24      www      3174: </table></td></tr>
1.8       www      3175: ENDSUPFORM
                   3176:        }
1.7       www      3177:     }
1.286     albertel 3178:     $r->print('</table>');
1.18      www      3179:     if ($allowed) {
1.287     albertel 3180: 	$r->print('
                   3181: <form method="post" name="extimport" action="/adm/coursedocs">
                   3182:   <input type="hidden" name="title" />
                   3183:   <input type="hidden" name="url" />
                   3184:   <input type="hidden" name="useform" />
                   3185:   <input type="hidden" name="residx" />
                   3186: </form>');
1.18      www      3187:     }
1.19      www      3188:   } else {
1.188     raeburn  3189:       unless ($upload_result eq 'phasetwo') {
1.19      www      3190: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  3191:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 3192: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.286     albertel 3193: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".
                   3194:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');
1.188     raeburn  3195:       }
1.19      www      3196:   }
1.26      www      3197:  }
1.224     albertel 3198:  $r->print(&Apache::loncommon::end_page());
1.26      www      3199:  return OK;
1.1       www      3200: } 
                   3201: 
1.224     albertel 3202: 
                   3203: sub editing_js {
                   3204:     my ($udom,$uname) = @_;
                   3205:     my $now = time();
1.302     bisitz   3206:     my %lt = &Apache::lonlocal::texthash(
                   3207:                                           p_mnf => 'Name of New Folder',
                   3208:                                           t_mnf => 'New Folder',
                   3209:                                           p_mnp => 'Name of New Page',
                   3210:                                           t_mnp => 'New Page',
1.305     bisitz   3211:                                           p_mxu => 'Title for the Uploaded Score',
                   3212:                                           p_msp => 'Title for the Page',
                   3213:                                           p_msb => 'Title for the Problem',
                   3214:                                           p_mdb => 'Title for the Drop Box',
                   3215:                                           p_mbb => 'Title for the Bulletin Board',
1.302     bisitz   3216:                                           p_mab => "Enter user:domain for User's 'About Me' Page",
                   3217:                                           p_mab2 => "About [_99]",
                   3218:                                           p_mab_alrt1 => 'Not a valid user:domain',
                   3219:                                           p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',
                   3220:                                           p_chn => 'New Title',
                   3221:                                           p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',
                   3222:                                           p_rmr2a => 'Remove[_99]',
                   3223:                                           p_rmr2b => '?[_99]',
1.303     raeburn  3224:                                           p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
                   3225:                                           p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
1.302     bisitz   3226:                                           p_ctr2a => 'Cut[_98]',
                   3227:                                           p_ctr2b => '?[_98]'
                   3228:                                         );
1.224     albertel 3229: 
                   3230:     return <<ENDNEWSCRIPT;
                   3231: function makenewfolder(targetform,folderseq) {
1.302     bisitz   3232:     var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
1.224     albertel 3233:     if (foldername) {
1.236     albertel 3234:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 3235:         targetform.submit();
                   3236:     }
                   3237: }
                   3238: 
                   3239: function makenewpage(targetform,folderseq) {
1.302     bisitz   3240:     var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}');
1.224     albertel 3241:     if (pagename) {
1.236     albertel 3242:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 3243:         targetform.submit();
                   3244:     }
                   3245: }
                   3246: 
                   3247: function makenewext(targetname) {
                   3248:     this.document.forms.extimport.useform.value=targetname;
1.287     albertel 3249:     this.document.forms.extimport.title.value='';
                   3250:     this.document.forms.extimport.url.value='';
                   3251:     this.document.forms.extimport.residx.value='';
                   3252:     window.open('/adm/rat/extpickframe.html');
                   3253: }
                   3254: 
                   3255: function edittext(targetname,residx,title,url) {
                   3256:     this.document.forms.extimport.useform.value=targetname;
                   3257:     this.document.forms.extimport.residx.value=residx;
                   3258:     this.document.forms.extimport.url.value=url;
                   3259:     this.document.forms.extimport.title.value=title;
1.224     albertel 3260:     window.open('/adm/rat/extpickframe.html');
                   3261: }
                   3262: 
                   3263: function makeexamupload() {
1.302     bisitz   3264:    var title=prompt('$lt{"p_mxu"}');
1.224     albertel 3265:    if (title) { 
                   3266:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 3267: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 3268:     this.document.forms.newexamupload.submit();
                   3269:    }
                   3270: }
                   3271: 
                   3272: function makesmppage() {
1.302     bisitz   3273:    var title=prompt('$lt{"p_msp"}');
1.224     albertel 3274:    if (title) { 
                   3275:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 3276: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 3277:     this.document.forms.newsmppg.submit();
                   3278:    }
                   3279: }
                   3280: 
                   3281: function makesmpproblem() {
1.302     bisitz   3282:    var title=prompt('$lt{"p_msb"}');
1.224     albertel 3283:    if (title) { 
                   3284:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 3285: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 3286:     this.document.forms.newsmpproblem.submit();
                   3287:    }
                   3288: }
                   3289: 
                   3290: function makedropbox() {
1.302     bisitz   3291:    var title=prompt('$lt{"p_mdb"}');
1.224     albertel 3292:    if (title) { 
                   3293:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 3294:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 3295:     this.document.forms.newdropbox.submit();
                   3296:    }
                   3297: }
                   3298: 
                   3299: function makebulboard() {
1.302     bisitz   3300:    var title=prompt('$lt{"p_mbb"}');
1.224     albertel 3301:    if (title) {
                   3302:     this.document.forms.newbul.importdetail.value=
1.236     albertel 3303: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 3304:     this.document.forms.newbul.submit();
                   3305:    }
                   3306: }
                   3307: 
                   3308: function makeabout() {
1.303     raeburn  3309:    var user=prompt("$lt{'p_mab'}");
1.224     albertel 3310:    if (user) {
                   3311:        var comp=new Array();
1.236     albertel 3312:        comp=user.split(':');
1.224     albertel 3313:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   3314: 	   if ((comp[0]) && (comp[1])) {
                   3315: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.302     bisitz   3316: 		   '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 3317: 	       this.document.forms.newaboutsomeone.submit();
                   3318: 	   } else {
1.302     bisitz   3319:                alert("$lt{'p_mab_alrt1'}");
1.224     albertel 3320:            }
                   3321:        } else {
1.302     bisitz   3322:            alert("$lt{'p_mab_alrt2'}");
1.224     albertel 3323:        }
                   3324:    }
                   3325: }
                   3326: 
                   3327: function makeims() {
                   3328:     var caller = document.forms.ims.folder.value;
                   3329:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   3330:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   3331:     newWindow.location.href = newlocation;
                   3332: }
                   3333: 
                   3334: 
                   3335: function finishpick() {
                   3336:     var title=this.document.forms.extimport.title.value;
                   3337:     var url=this.document.forms.extimport.url.value;
                   3338:     var form=this.document.forms.extimport.useform.value;
1.287     albertel 3339:     var residx=this.document.forms.extimport.residx.value;
                   3340:     eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();');
1.224     albertel 3341: }
                   3342: 
                   3343: function changename(folderpath,index,oldtitle,container,pagesymb) {
1.302     bisitz   3344:     var title=prompt('$lt{"p_chn"}',oldtitle);
1.224     albertel 3345:     if (title) {
1.281     albertel 3346: 	this.document.forms.renameform.markcopy.value=-1;
1.224     albertel 3347: 	this.document.forms.renameform.title.value=title;
                   3348: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   3349:         if (container == 'sequence') {
                   3350: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   3351:         }
                   3352:         if (container == 'page') {
                   3353:             this.document.forms.renameform.pagepath.value=folderpath;
                   3354:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3355:         }
                   3356:         this.document.forms.renameform.submit();
                   3357:     }
                   3358: }
                   3359: 
1.291     albertel 3360: function removeres(folderpath,index,oldtitle,container,pagesymb,skip_confirm) {
1.302     bisitz   3361:     if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
1.281     albertel 3362: 	this.document.forms.renameform.markcopy.value=-1;
1.224     albertel 3363: 	this.document.forms.renameform.cmd.value='del_'+index;
                   3364:         if (container == 'sequence') {
                   3365:             this.document.forms.renameform.folderpath.value=folderpath;
                   3366:         }
                   3367:         if (container == 'page') {
                   3368:             this.document.forms.renameform.pagepath.value=folderpath;
                   3369:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3370:         }
                   3371:         this.document.forms.renameform.submit();
                   3372:     }
                   3373: }
                   3374: 
1.291     albertel 3375: function cutres(folderpath,index,oldtitle,container,pagesymb,folder,skip_confirm) {
1.303     raeburn  3376:     if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
1.224     albertel 3377: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   3378: 	this.document.forms.renameform.markcopy.value=index;
1.281     albertel 3379: 	this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224     albertel 3380:         if (container == 'sequence') {
                   3381:             this.document.forms.renameform.folderpath.value=folderpath;
                   3382:         }
                   3383:         if (container == 'page') {
                   3384:             this.document.forms.renameform.pagepath.value=folderpath;
                   3385:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3386:         }
                   3387:         this.document.forms.renameform.submit();
                   3388:     }
                   3389: }
                   3390: 
1.281     albertel 3391: function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) {
1.224     albertel 3392:     this.document.forms.renameform.markcopy.value=index;
1.281     albertel 3393:     this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224     albertel 3394:     if (container == 'sequence') {
                   3395: 	this.document.forms.renameform.folderpath.value=folderpath;
                   3396:     }
                   3397:     if (container == 'page') {
                   3398: 	this.document.forms.renameform.pagepath.value=folderpath;
                   3399: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   3400:     }
                   3401:     this.document.forms.renameform.submit();
                   3402: }
                   3403: 
                   3404: ENDNEWSCRIPT
                   3405: }
1.1       www      3406: 1;
                   3407: __END__
1.315     jms      3408: 
1.317     jms      3409: 
                   3410: =head1 NAME
                   3411: 
                   3412: Apache::londocs.pm
                   3413: 
                   3414: =head1 SYNOPSIS
                   3415: 
                   3416: This is part of the LearningOnline Network with CAPA project
                   3417: described at http://www.lon-capa.org.
                   3418: 
                   3419: =head1 SUBROUTINES
                   3420: 
                   3421: =over
                   3422: 
                   3423: =item %help=()
                   3424: 
                   3425: Available help topics
                   3426: 
                   3427: =item mapread()
                   3428: 
                   3429: Mapread read maps into LONCAPA::map:: global arrays 
                   3430: @order and @resources, determines status
                   3431: sets @order - pointer to resources in right order
                   3432: sets @resources - array with the resources with correct idx
                   3433: 
                   3434: =item authorhosts()
                   3435: 
                   3436: Return hash with valid author names
                   3437: 
                   3438: =item dumpbutton()
                   3439: 
                   3440: Generate "dump" button
                   3441: 
                   3442: =item clean()
                   3443: 
                   3444: =item dumpcourse()
                   3445: 
                   3446:     Actually dump course
                   3447: 
                   3448: 
                   3449: =item exportbutton()
                   3450: 
                   3451:     Generate "export" button
                   3452: 
                   3453: =item exportcourse()
                   3454: 
                   3455: =item create_ims_store()
                   3456: 
                   3457: =item build_package()
                   3458: 
                   3459: =item get_dependencies()
                   3460: 
                   3461: =item process_content()
                   3462: 
                   3463: =item replicate_content()
                   3464: 
                   3465: =item extract_media()
                   3466: 
                   3467: =item store_template()
                   3468: 
                   3469: =item group_import()
                   3470: 
                   3471:     Imports the given (name, url) resources into the course
                   3472:     coursenum, coursedom, and folder must precede the list
                   3473: 
                   3474: =item breadcrumbs()
                   3475: 
                   3476: =item log_docs()
                   3477: 
                   3478: =item docs_change_log()
                   3479: 
                   3480: =item update_paste_buffer()
                   3481: 
                   3482: =item print_paste_buffer()
                   3483: 
                   3484: =item do_paste_from_buffer()
                   3485: 
                   3486: =item update_parameter()
                   3487: 
                   3488: =item handle_edit_cmd()
                   3489: 
                   3490: =item editor()
                   3491: 
                   3492: =item process_file_upload()
                   3493: 
                   3494: =item process_secondary_uploads()
                   3495: 
                   3496: =item is_supplemental_title()
                   3497: 
                   3498: =item parse_supplemental_title()
                   3499: 
                   3500: =item entryline()
                   3501: 
                   3502: =item tiehash()
                   3503: 
                   3504: =item untiehash()
                   3505: 
                   3506: =item checkonthis()
                   3507: 
                   3508: check on this
                   3509: 
                   3510: =item verifycontent()
                   3511: 
                   3512: Verify Content
                   3513: 
                   3514: =item devalidateversioncache() & checkversions()
                   3515: 
                   3516: Check Versions
                   3517: 
                   3518: =item mark_hash_old()
                   3519: 
                   3520: =item is_hash_old()
                   3521: 
                   3522: =item changewarning()
                   3523: 
                   3524: =item init_breadcrumbs()
                   3525: 
                   3526: Breadcrumbs for special functions
1.315     jms      3527: 
                   3528: =back
                   3529: 
                   3530: =cut

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