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

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

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