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

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

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