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

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

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