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

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

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